@raintonic/formaui 0.2.0 → 0.3.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 (186) hide show
  1. package/CHANGELOG.md +104 -7
  2. package/LICENSE +21 -0
  3. package/README.md +199 -145
  4. package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs.map +1 -1
  5. package/fesm2022/raintonic-formaui-cdk-form-field.mjs.map +1 -1
  6. package/fesm2022/raintonic-formaui-cdk-overlay.mjs +0 -26
  7. package/fesm2022/raintonic-formaui-cdk-overlay.mjs.map +1 -1
  8. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs +2 -2
  9. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs.map +1 -1
  10. package/fesm2022/raintonic-formaui-components-accordion.mjs +2 -2
  11. package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -1
  12. package/fesm2022/raintonic-formaui-components-alert.mjs +24 -5
  13. package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -1
  14. package/fesm2022/raintonic-formaui-components-autocomplete.mjs +38 -9
  15. package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -1
  16. package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -1
  17. package/fesm2022/raintonic-formaui-components-badge.mjs +45 -31
  18. package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -1
  19. package/fesm2022/raintonic-formaui-components-big-menu.mjs +23 -5
  20. package/fesm2022/raintonic-formaui-components-big-menu.mjs.map +1 -1
  21. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs +24 -7
  22. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs.map +1 -1
  23. package/fesm2022/raintonic-formaui-components-button-group.mjs +6 -6
  24. package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -1
  25. package/fesm2022/raintonic-formaui-components-button.mjs +63 -17
  26. package/fesm2022/raintonic-formaui-components-button.mjs.map +1 -1
  27. package/fesm2022/raintonic-formaui-components-card.mjs +8 -8
  28. package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
  29. package/fesm2022/raintonic-formaui-components-checkbox.mjs +2 -2
  30. package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -1
  31. package/fesm2022/raintonic-formaui-components-data-table.mjs +67 -9
  32. package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
  33. package/fesm2022/raintonic-formaui-components-date-picker.mjs +63 -16
  34. package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -1
  35. package/fesm2022/raintonic-formaui-components-divider.mjs +2 -2
  36. package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -1
  37. package/fesm2022/raintonic-formaui-components-drawer.mjs +19 -4
  38. package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
  39. package/fesm2022/raintonic-formaui-components-empty-state.mjs +2 -2
  40. package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -1
  41. package/fesm2022/raintonic-formaui-components-file-upload.mjs +25 -5
  42. package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -1
  43. package/fesm2022/raintonic-formaui-components-form-field.mjs +21 -6
  44. package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
  45. package/fesm2022/raintonic-formaui-components-icon.mjs +2 -2
  46. package/fesm2022/raintonic-formaui-components-icon.mjs.map +1 -1
  47. package/fesm2022/raintonic-formaui-components-input.mjs +1 -1
  48. package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
  49. package/fesm2022/raintonic-formaui-components-list.mjs +4 -4
  50. package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -1
  51. package/fesm2022/raintonic-formaui-components-menu.mjs +4 -4
  52. package/fesm2022/raintonic-formaui-components-menu.mjs.map +1 -1
  53. package/fesm2022/raintonic-formaui-components-number-input.mjs +20 -5
  54. package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -1
  55. package/fesm2022/raintonic-formaui-components-paginator.mjs +27 -7
  56. package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -1
  57. package/fesm2022/raintonic-formaui-components-password-input.mjs +23 -5
  58. package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -1
  59. package/fesm2022/raintonic-formaui-components-popover.mjs +2 -2
  60. package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -1
  61. package/fesm2022/raintonic-formaui-components-progressbar.mjs +32 -7
  62. package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -1
  63. package/fesm2022/raintonic-formaui-components-radio.mjs +4 -4
  64. package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -1
  65. package/fesm2022/raintonic-formaui-components-select.mjs +41 -26
  66. package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
  67. package/fesm2022/raintonic-formaui-components-side-panel.mjs +19 -4
  68. package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
  69. package/fesm2022/raintonic-formaui-components-sidebar.mjs +23 -5
  70. package/fesm2022/raintonic-formaui-components-sidebar.mjs.map +1 -1
  71. package/fesm2022/raintonic-formaui-components-skeleton.mjs +2 -2
  72. package/fesm2022/raintonic-formaui-components-skeleton.mjs.map +1 -1
  73. package/fesm2022/raintonic-formaui-components-slider.mjs +23 -5
  74. package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -1
  75. package/fesm2022/raintonic-formaui-components-spinner.mjs +24 -7
  76. package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -1
  77. package/fesm2022/raintonic-formaui-components-stepper.mjs +2 -2
  78. package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -1
  79. package/fesm2022/raintonic-formaui-components-tab.mjs +10 -10
  80. package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -1
  81. package/fesm2022/raintonic-formaui-components-tag.mjs +21 -4
  82. package/fesm2022/raintonic-formaui-components-tag.mjs.map +1 -1
  83. package/fesm2022/raintonic-formaui-components-time-picker.mjs +26 -7
  84. package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -1
  85. package/fesm2022/raintonic-formaui-components-toggle.mjs +2 -2
  86. package/fesm2022/raintonic-formaui-components-toggle.mjs.map +1 -1
  87. package/fesm2022/raintonic-formaui-components-toolbar.mjs +41 -7
  88. package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
  89. package/fesm2022/raintonic-formaui-components-tooltip.mjs +2 -2
  90. package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -1
  91. package/fesm2022/raintonic-formaui-components-tree-select.mjs +2 -2
  92. package/fesm2022/raintonic-formaui-components-tree-select.mjs.map +1 -1
  93. package/fesm2022/raintonic-formaui-components-tree-table.mjs +35 -6
  94. package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -1
  95. package/fesm2022/raintonic-formaui-components-tree.mjs +25 -7
  96. package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -1
  97. package/fesm2022/raintonic-formaui-core.mjs +25 -1
  98. package/fesm2022/raintonic-formaui-core.mjs.map +1 -1
  99. package/fesm2022/raintonic-formaui-services-dialog.mjs +37 -37
  100. package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
  101. package/fesm2022/raintonic-formaui-services-notification.mjs +2 -2
  102. package/fesm2022/raintonic-formaui-services-notification.mjs.map +1 -1
  103. package/fesm2022/raintonic-formaui-services-theme.mjs +3 -3
  104. package/fesm2022/raintonic-formaui-services-theme.mjs.map +1 -1
  105. package/fesm2022/raintonic-formaui-test-utils.mjs +21 -16
  106. package/fesm2022/raintonic-formaui-test-utils.mjs.map +1 -1
  107. package/fesm2022/raintonic-formaui.mjs +1 -1
  108. package/fesm2022/raintonic-formaui.mjs.map +1 -1
  109. package/llms-full.txt +36 -122
  110. package/llms.txt +4 -5
  111. package/package.json +1 -5
  112. package/styles/index.scss +5 -5
  113. package/styles/partials/_motion.scss +25 -0
  114. package/styles/partials/_theme.scss +6 -5
  115. package/styles/partials/components/_button.scss +361 -0
  116. package/styles/partials/components/_dialog.scss +180 -0
  117. package/styles/partials/components/_overlay.scss +87 -0
  118. package/styles/partials/themes/_dark.scss +14 -0
  119. package/styles/partials/themes/_light.scss +14 -0
  120. package/types/raintonic-formaui-cdk-overlay.d.ts +0 -1
  121. package/types/raintonic-formaui-cdk-overlay.d.ts.map +1 -1
  122. package/types/raintonic-formaui-components-alert.d.ts +11 -1
  123. package/types/raintonic-formaui-components-alert.d.ts.map +1 -1
  124. package/types/raintonic-formaui-components-autocomplete.d.ts +25 -7
  125. package/types/raintonic-formaui-components-autocomplete.d.ts.map +1 -1
  126. package/types/raintonic-formaui-components-badge.d.ts +20 -9
  127. package/types/raintonic-formaui-components-badge.d.ts.map +1 -1
  128. package/types/raintonic-formaui-components-big-menu.d.ts +12 -1
  129. package/types/raintonic-formaui-components-big-menu.d.ts.map +1 -1
  130. package/types/raintonic-formaui-components-breadcrumb.d.ts +11 -2
  131. package/types/raintonic-formaui-components-breadcrumb.d.ts.map +1 -1
  132. package/types/raintonic-formaui-components-button-group.d.ts +6 -6
  133. package/types/raintonic-formaui-components-button.d.ts +9 -7
  134. package/types/raintonic-formaui-components-button.d.ts.map +1 -1
  135. package/types/raintonic-formaui-components-card.d.ts +4 -4
  136. package/types/raintonic-formaui-components-checkbox.d.ts +1 -1
  137. package/types/raintonic-formaui-components-data-table.d.ts +56 -16
  138. package/types/raintonic-formaui-components-data-table.d.ts.map +1 -1
  139. package/types/raintonic-formaui-components-date-picker.d.ts +32 -4
  140. package/types/raintonic-formaui-components-date-picker.d.ts.map +1 -1
  141. package/types/raintonic-formaui-components-drawer.d.ts +10 -1
  142. package/types/raintonic-formaui-components-drawer.d.ts.map +1 -1
  143. package/types/raintonic-formaui-components-file-upload.d.ts +12 -1
  144. package/types/raintonic-formaui-components-file-upload.d.ts.map +1 -1
  145. package/types/raintonic-formaui-components-form-field.d.ts +12 -2
  146. package/types/raintonic-formaui-components-form-field.d.ts.map +1 -1
  147. package/types/raintonic-formaui-components-input.d.ts +1 -1
  148. package/types/raintonic-formaui-components-number-input.d.ts +11 -2
  149. package/types/raintonic-formaui-components-number-input.d.ts.map +1 -1
  150. package/types/raintonic-formaui-components-paginator.d.ts +13 -1
  151. package/types/raintonic-formaui-components-paginator.d.ts.map +1 -1
  152. package/types/raintonic-formaui-components-password-input.d.ts +12 -2
  153. package/types/raintonic-formaui-components-password-input.d.ts.map +1 -1
  154. package/types/raintonic-formaui-components-progressbar.d.ts +14 -1
  155. package/types/raintonic-formaui-components-progressbar.d.ts.map +1 -1
  156. package/types/raintonic-formaui-components-select.d.ts.map +1 -1
  157. package/types/raintonic-formaui-components-side-panel.d.ts +10 -1
  158. package/types/raintonic-formaui-components-side-panel.d.ts.map +1 -1
  159. package/types/raintonic-formaui-components-sidebar.d.ts +12 -1
  160. package/types/raintonic-formaui-components-sidebar.d.ts.map +1 -1
  161. package/types/raintonic-formaui-components-slider.d.ts +12 -1
  162. package/types/raintonic-formaui-components-slider.d.ts.map +1 -1
  163. package/types/raintonic-formaui-components-spinner.d.ts +12 -2
  164. package/types/raintonic-formaui-components-spinner.d.ts.map +1 -1
  165. package/types/raintonic-formaui-components-tag.d.ts +10 -1
  166. package/types/raintonic-formaui-components-tag.d.ts.map +1 -1
  167. package/types/raintonic-formaui-components-time-picker.d.ts +14 -2
  168. package/types/raintonic-formaui-components-time-picker.d.ts.map +1 -1
  169. package/types/raintonic-formaui-components-toggle.d.ts +1 -1
  170. package/types/raintonic-formaui-components-toolbar.d.ts +22 -4
  171. package/types/raintonic-formaui-components-toolbar.d.ts.map +1 -1
  172. package/types/raintonic-formaui-components-tree-table.d.ts +29 -4
  173. package/types/raintonic-formaui-components-tree-table.d.ts.map +1 -1
  174. package/types/raintonic-formaui-components-tree.d.ts +12 -1
  175. package/types/raintonic-formaui-components-tree.d.ts.map +1 -1
  176. package/types/raintonic-formaui-core.d.ts +19 -2
  177. package/types/raintonic-formaui-core.d.ts.map +1 -1
  178. package/types/raintonic-formaui-services-dialog.d.ts +1 -1
  179. package/types/raintonic-formaui-services-theme.d.ts +3 -3
  180. package/types/raintonic-formaui-test-utils.d.ts +15 -2
  181. package/types/raintonic-formaui-test-utils.d.ts.map +1 -1
  182. package/types/raintonic-formaui.d.ts +1 -1
  183. package/fesm2022/raintonic-formaui-components-dynamic-form.mjs +0 -266
  184. package/fesm2022/raintonic-formaui-components-dynamic-form.mjs.map +0 -1
  185. package/types/raintonic-formaui-components-dynamic-form.d.ts +0 -412
  186. package/types/raintonic-formaui-components-dynamic-form.d.ts.map +0 -1
package/styles/index.scss CHANGED
@@ -23,9 +23,9 @@
23
23
  @forward './partials/utilities';
24
24
 
25
25
  // 8. Component global styles
26
- @use '../components/button/button.directive';
27
- @use '../cdk/overlay/overlay';
28
- @use '../services/dialog/dialog';
26
+ @use './partials/components/button';
27
+ @use './partials/components/overlay';
28
+ @use './partials/components/dialog';
29
29
 
30
30
  // Use the modules for this file's styles
31
31
  @use './partials/mixins' as *;
@@ -84,8 +84,8 @@ button {
84
84
  @include fui-button-reset();
85
85
  }
86
86
 
87
- // Link styles
88
- a {
87
+ // Link styles — exclude fui-button anchors, which have their own variant system
88
+ a:not(.fui-button) {
89
89
  color: var(--fui-primary);
90
90
  text-decoration: none;
91
91
 
@@ -250,3 +250,28 @@
250
250
  .fui-slide-in {
251
251
  animation: fui-slide-in var(--fui-duration-moderate-01) var(--fui-ease-entrance);
252
252
  }
253
+
254
+ // Popover/dropdown entrance — for panels portaled into the overlay container
255
+ // (datepicker calendar, menu, autocomplete). Transform-origin should be set
256
+ // by the consumer to match the side where the panel is anchored.
257
+ @keyframes fui-popover-enter {
258
+ from {
259
+ opacity: 0;
260
+ transform: translateY(-14px);
261
+ }
262
+ 60% {
263
+ opacity: 1;
264
+ }
265
+ to {
266
+ opacity: 1;
267
+ transform: translateY(0);
268
+ }
269
+ }
270
+
271
+ @mixin fui-motion-popover-enter(
272
+ $duration: var(--fui-duration-moderate-01),
273
+ $easing: var(--fui-ease-entrance)
274
+ ) {
275
+ animation: fui-popover-enter $duration $easing both;
276
+ will-change: transform, opacity;
277
+ }
@@ -145,13 +145,14 @@
145
145
 
146
146
  // === COMPONENT SIZES ===
147
147
  // Button heights
148
- --fui-button-height-sm: 1.5rem; // 32px
149
- --fui-button-height-md: 2.5rem; // 40px
150
- --fui-button-height-lg: 3rem; // 48px
151
- --fui-button-height-xl: 4rem; // 64px
148
+ --fui-button-height-sm: 1.75rem; // 28px
149
+ --fui-button-height-md: 2.25rem; // 36px
150
+ --fui-button-height-lg: 2.75rem; // 44px
151
+ --fui-button-height-xl: 3.25rem; // 52px
152
+ --fui-button-height-2xl: 4rem; // 64px
152
153
 
153
154
  // Input heights
154
- --fui-input-height: 2.5rem; // 44px
155
+ --fui-input-height: 2.25rem; // 36px (matches --fui-button-height-md)
155
156
 
156
157
  // Icon sizes
157
158
  --fui-icon-size-sm: 0.75rem; // 16px
@@ -0,0 +1,361 @@
1
+ // Button component styles aligned with theme tokens
2
+ @use '../constants' as *;
3
+ @use '../mixins' as mixins;
4
+ @use '../motion' as motion;
5
+
6
+ .fui-button {
7
+ // Component tokens with fallbacks
8
+ --fui-button-height: var(--fui-button-height-md);
9
+ --fui-button-font-size: var(--fui-font-size-02);
10
+ --fui-button-border-radius: var(--fui-border-radius-sm);
11
+ --fui-button-padding-x: var(--fui-spacing-05);
12
+ --fui-button-padding-y: var(--fui-spacing-03);
13
+ --fui-button-gap: var(--fui-spacing-03);
14
+ --fui-button-font-weight: var(--fui-font-weight-semibold);
15
+ --fui-button-letter-spacing: var(--fui-letter-spacing-wide);
16
+
17
+ // Default spinner/text foreground used during loading
18
+ @include mixins.fui-button-reset();
19
+ @include motion.fui-motion(all, var(--fui-duration-fast-02));
20
+
21
+ position: relative;
22
+ display: inline-flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ gap: var(--fui-button-gap);
26
+ overflow: hidden;
27
+
28
+ font-family: var(--fui-font-family-sans);
29
+ font-weight: var(--fui-button-font-weight);
30
+ text-decoration: none;
31
+ text-align: center;
32
+ vertical-align: middle;
33
+ white-space: nowrap;
34
+ user-select: none;
35
+ letter-spacing: var(--fui-button-letter-spacing);
36
+ border-radius: var(--fui-button-border-radius);
37
+ box-sizing: border-box;
38
+ cursor: pointer;
39
+ min-height: var(--fui-button-height);
40
+
41
+ &:focus-visible {
42
+ @include mixins.fui-focus-ring();
43
+ }
44
+
45
+ // Loading spinner
46
+ &__spinner {
47
+ display: inline-flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ }
51
+
52
+ &__spinner-icon {
53
+ width: var(--fui-icon-size-sm);
54
+ height: var(--fui-icon-size-sm);
55
+ border: 2px solid currentColor;
56
+ border-top-color: transparent;
57
+ border-radius: 50%;
58
+ animation: fui-spin var(--fui-duration-slow-02) linear infinite;
59
+ }
60
+
61
+ &__leading {
62
+ display: contents;
63
+ }
64
+
65
+ // Ripple effect on click
66
+ &__ripple {
67
+ position: absolute;
68
+ border-radius: 50%;
69
+ background-color: currentColor;
70
+ opacity: 0.35;
71
+ pointer-events: none;
72
+ transform: scale(0);
73
+ animation: fui-button-ripple var(--fui-duration-slow-01, 400ms) ease-out forwards;
74
+ }
75
+
76
+ @media (prefers-reduced-motion: reduce) {
77
+ &__ripple {
78
+ animation: none;
79
+ display: none;
80
+ }
81
+ }
82
+
83
+ // WCAG 2.1 AA: ensure minimum 44x44px touch target for smaller sizes
84
+ // Uses a pseudo-element so visual size remains unchanged
85
+ &::after {
86
+ content: '';
87
+ position: absolute;
88
+ inset: 50% auto auto 50%;
89
+ min-width: 44px;
90
+ min-height: 44px;
91
+ width: 100%;
92
+ height: 100%;
93
+ transform: translate(-50%, -50%);
94
+ }
95
+
96
+ // States
97
+ &--disabled {
98
+ cursor: not-allowed;
99
+ opacity: var(--fui-opacity-disabled);
100
+ }
101
+
102
+ &--loading {
103
+ cursor: wait;
104
+
105
+ .fui-button__leading {
106
+ display: inline-flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+ }
110
+
111
+ // Hide any user-supplied icon child except the spinner
112
+ > .fui-icon:not(.fui-button__spinner),
113
+ > fui-icon:not(.fui-button__spinner) {
114
+ display: none;
115
+ }
116
+ }
117
+
118
+ &--full-width {
119
+ width: 100%;
120
+ }
121
+
122
+ // Sizes
123
+ &--sm {
124
+ min-height: var(--fui-button-height-sm);
125
+ padding: calc(var(--fui-spacing-03) - 2px) var(--fui-spacing-03);
126
+ font-size: var(--fui-font-size-01);
127
+
128
+ &.fui-button--icon-only {
129
+ width: var(--fui-button-height-sm);
130
+ padding: calc(var(--fui-spacing-03) - 2px);
131
+ }
132
+
133
+ .fui-icon {
134
+ width: var(--fui-icon-size-sm);
135
+ height: var(--fui-icon-size-sm);
136
+ }
137
+ }
138
+
139
+ &--md {
140
+ min-height: var(--fui-button-height-md);
141
+ padding: var(--fui-spacing-03) var(--fui-spacing-05);
142
+ font-size: var(--fui-font-size-02);
143
+
144
+ &.fui-button--icon-only {
145
+ width: var(--fui-button-height-md);
146
+ padding: var(--fui-spacing-03);
147
+ }
148
+
149
+ .fui-icon {
150
+ width: var(--fui-icon-size-md);
151
+ height: var(--fui-icon-size-md);
152
+ }
153
+ }
154
+
155
+ &--lg {
156
+ min-height: var(--fui-button-height-lg);
157
+ padding: calc(var(--fui-spacing-04) - 2px) var(--fui-spacing-05);
158
+ font-size: var(--fui-font-size-03);
159
+
160
+ &.fui-button--icon-only {
161
+ width: var(--fui-button-height-lg);
162
+ padding: calc(var(--fui-spacing-04) - 2px);
163
+ }
164
+
165
+ .fui-icon {
166
+ width: var(--fui-icon-size-md);
167
+ height: var(--fui-icon-size-md);
168
+ }
169
+ }
170
+
171
+ &--xl {
172
+ min-height: var(--fui-button-height-xl);
173
+ padding: var(--fui-spacing-04) var(--fui-spacing-06);
174
+ font-size: var(--fui-font-size-03);
175
+
176
+ &.fui-button--icon-only {
177
+ width: var(--fui-button-height-xl);
178
+ padding: var(--fui-spacing-04);
179
+ }
180
+
181
+ .fui-icon {
182
+ width: var(--fui-icon-size-md);
183
+ height: var(--fui-icon-size-md);
184
+ }
185
+ }
186
+
187
+ &--2xl {
188
+ min-height: var(--fui-button-height-2xl);
189
+ padding: var(--fui-spacing-05) var(--fui-spacing-06);
190
+ font-size: var(--fui-font-size-03);
191
+
192
+ &.fui-button--icon-only {
193
+ width: var(--fui-button-height-2xl);
194
+ padding: var(--fui-spacing-05);
195
+ }
196
+
197
+ .fui-icon {
198
+ width: var(--fui-icon-size-md);
199
+ height: var(--fui-icon-size-md);
200
+ }
201
+ }
202
+
203
+ // Variant styles
204
+ // =============================================================================
205
+
206
+ // Primary — solid violet
207
+ &--primary {
208
+ background-color: var(--fui-primary-default);
209
+ color: var(--fui-primary-text);
210
+ border-color: transparent;
211
+ box-shadow: var(--fui-shadow-02);
212
+
213
+ &:hover:not(.fui-button--disabled) {
214
+ background-color: var(--fui-primary-hover);
215
+ box-shadow: var(--fui-shadow-03);
216
+ }
217
+
218
+ &:active:not(.fui-button--disabled) {
219
+ background-color: var(--fui-primary-hover);
220
+ box-shadow: none;
221
+ }
222
+ }
223
+
224
+ // Secondary — white bg with border
225
+ &--secondary {
226
+ background-color: var(--fui-surface-card);
227
+ color: var(--fui-text-primary);
228
+ box-shadow: inset 0 0 0 var(--fui-border-width-md) var(--fui-border-color);
229
+
230
+ &:hover:not(.fui-button--disabled) {
231
+ background-color: var(--fui-surface-02);
232
+ }
233
+
234
+ &:active:not(.fui-button--disabled) {
235
+ background-color: var(--fui-surface-02);
236
+ }
237
+ }
238
+
239
+ // Tertiary — neutral text, no bg/border
240
+ &--tertiary {
241
+ background-color: transparent;
242
+ color: var(--fui-tertiary-text);
243
+ border-color: transparent;
244
+
245
+ &:hover:not(.fui-button--disabled) {
246
+ background-color: var(--fui-tertiary-hover-bg);
247
+ }
248
+
249
+ &:active:not(.fui-button--disabled) {
250
+ background-color: var(--fui-tertiary-hover-bg);
251
+ }
252
+ }
253
+
254
+ // Tertiary-violet — violet text, no bg/border
255
+ &--tertiary-violet {
256
+ background-color: transparent;
257
+ color: var(--fui-tertiary-violet-text);
258
+ border-color: transparent;
259
+
260
+ &:hover:not(.fui-button--disabled) {
261
+ background-color: var(--fui-tertiary-violet-hover-bg);
262
+ }
263
+
264
+ &:active:not(.fui-button--disabled) {
265
+ background-color: var(--fui-tertiary-violet-hover-bg);
266
+ }
267
+ }
268
+
269
+ // Link — underlined violet text on hover
270
+ &--link {
271
+ background-color: transparent;
272
+ color: var(--fui-primary);
273
+
274
+ &:hover:not(.fui-button--disabled) {
275
+ text-decoration: underline;
276
+ }
277
+
278
+ &:active:not(.fui-button--disabled) {
279
+ text-decoration: underline;
280
+ }
281
+ }
282
+
283
+ // Destructive — solid red
284
+ &--destructive {
285
+ background-color: var(--fui-destructive-default);
286
+ color: var(--fui-destructive-text);
287
+ border-color: transparent;
288
+ box-shadow: var(--fui-shadow-02);
289
+
290
+ &:hover:not(.fui-button--disabled) {
291
+ background-color: var(--fui-destructive-hover);
292
+ box-shadow: var(--fui-shadow-03);
293
+ }
294
+
295
+ &:active:not(.fui-button--disabled) {
296
+ background-color: var(--fui-destructive-hover);
297
+ box-shadow: none;
298
+ }
299
+ }
300
+
301
+ // Icon adjustments
302
+ &--icon-only {
303
+ gap: 0;
304
+
305
+ .fui-icon {
306
+ margin: 0;
307
+ }
308
+ }
309
+ }
310
+
311
+ // Icon spacing within buttons
312
+ .fui-icon {
313
+ flex-shrink: 0;
314
+
315
+ &[fuiPrefix] {
316
+ margin-right: var(--fui-spacing-02);
317
+ }
318
+
319
+ &[fuiSuffix] {
320
+ margin-left: var(--fui-spacing-02);
321
+ }
322
+ }
323
+
324
+ // High contrast mode support
325
+ @media (prefers-contrast: more) {
326
+ .fui-button {
327
+ &--secondary {
328
+ border-width: 3px;
329
+ }
330
+
331
+ &:focus-visible {
332
+ outline-width: 3px;
333
+ }
334
+ }
335
+ }
336
+
337
+ // Keyframes
338
+ @keyframes fui-spin {
339
+ from {
340
+ transform: rotate(0deg);
341
+ }
342
+ to {
343
+ transform: rotate(360deg);
344
+ }
345
+ }
346
+
347
+ @keyframes fui-button-ripple {
348
+ to {
349
+ transform: scale(2.5);
350
+ opacity: 0;
351
+ }
352
+ }
353
+
354
+ // Print styles
355
+ @media print {
356
+ .fui-button {
357
+ &__spinner {
358
+ display: none !important;
359
+ }
360
+ }
361
+ }
@@ -0,0 +1,180 @@
1
+ /**
2
+ * # Dialog Styles
3
+ *
4
+ * Global styles for the fui dialog component.
5
+ * These styles are applied to the overlay elements.
6
+ */
7
+
8
+ // Component tokens with fallbacks
9
+ .fui-dialog-panel {
10
+ --fui-dialog-backdrop-color: var(--fui-black-30);
11
+ --fui-dialog-title-padding: var(--fui-padding-24) var(--fui-padding-24) 0;
12
+ --fui-dialog-title-font-size: var(--fui-font-size-05);
13
+ --fui-dialog-title-font-weight: var(--fui-font-weight-medium);
14
+ --fui-dialog-title-line-height: 1.4;
15
+ --fui-dialog-content-padding: var(--fui-padding-24);
16
+ --fui-dialog-content-font-size: var(--fui-font-size-02);
17
+ --fui-dialog-content-line-height: 1.5;
18
+ --fui-dialog-actions-gap: var(--fui-gap-8);
19
+ --fui-dialog-actions-padding: var(--fui-padding-8) var(--fui-padding-24) var(--fui-padding-24);
20
+ --fui-dialog-actions-min-height: 52px;
21
+ --fui-dialog-close-top: var(--fui-padding-8);
22
+ --fui-dialog-close-right: var(--fui-padding-8);
23
+ }
24
+
25
+ // Dialog backdrop
26
+ // Note: z-index is applied dynamically by the overlay service for proper stacking
27
+ .fui-dialog-backdrop {
28
+ position: fixed;
29
+ inset: 0;
30
+ background-color: var(--fui-dialog-backdrop-color);
31
+ transition: opacity var(--fui-duration-moderate-02) var(--fui-ease-standard);
32
+ }
33
+
34
+ // Dialog panel (overlay pane)
35
+ // Note: z-index is applied dynamically by the overlay service for proper stacking
36
+ .fui-dialog-panel {
37
+ display: flex;
38
+ flex-direction: column;
39
+ position: fixed;
40
+ pointer-events: auto;
41
+ box-sizing: border-box;
42
+ outline: 0;
43
+
44
+ // Enter animation
45
+ &:not(.fui-dialog-exit) {
46
+ animation: fui-dialog-panel-enter var(--fui-duration-moderate-02) var(--fui-ease-entrance);
47
+ }
48
+
49
+ // Exit animation
50
+ &.fui-dialog-exit {
51
+ animation: fui-dialog-panel-exit var(--fui-duration-moderate-01) var(--fui-ease-exit) forwards;
52
+ }
53
+ }
54
+
55
+ // Dialog container host
56
+ .fui-dialog-container-host {
57
+ display: block;
58
+ width: 100%;
59
+ height: 100%;
60
+ }
61
+
62
+ // Animation keyframes
63
+ @keyframes fui-dialog-panel-enter {
64
+ from {
65
+ opacity: 0;
66
+ }
67
+ to {
68
+ opacity: 1;
69
+ }
70
+ }
71
+
72
+ @keyframes fui-dialog-panel-exit {
73
+ from {
74
+ opacity: 1;
75
+ }
76
+ to {
77
+ opacity: 0;
78
+ }
79
+ }
80
+
81
+ // Dialog content sections (optional utility classes)
82
+ .fui-dialog-title {
83
+ display: block;
84
+ margin: 0;
85
+ padding: var(--fui-dialog-title-padding, 24px 24px 0);
86
+ font-size: var(--fui-dialog-title-font-size, 20px);
87
+ font-weight: var(--fui-dialog-title-font-weight, 500);
88
+ line-height: var(--fui-dialog-title-line-height, 1.4);
89
+ color: var(--fui-dialog-title-color, inherit);
90
+ }
91
+
92
+ .fui-dialog-content {
93
+ display: block;
94
+ flex: 1;
95
+ overflow: auto;
96
+ padding: var(--fui-dialog-content-padding, 20px 24px);
97
+ font-size: var(--fui-dialog-content-font-size, 14px);
98
+ line-height: var(--fui-dialog-content-line-height, 1.5);
99
+ color: var(--fui-dialog-content-color, inherit);
100
+
101
+ // Remove default margin for first/last elements
102
+ > :first-child {
103
+ margin-top: 0;
104
+ }
105
+
106
+ > :last-child {
107
+ margin-bottom: 0;
108
+ }
109
+ }
110
+
111
+ .fui-dialog-actions {
112
+ display: flex;
113
+ flex-wrap: wrap;
114
+ align-items: center;
115
+ justify-content: flex-end;
116
+ gap: var(--fui-dialog-actions-gap, 8px);
117
+ padding: var(--fui-dialog-actions-padding, 8px 24px 24px);
118
+ min-height: var(--fui-dialog-actions-min-height, 52px);
119
+
120
+ // Align actions to the start
121
+ &.fui-dialog-actions-start {
122
+ justify-content: flex-start;
123
+ }
124
+
125
+ // Center actions
126
+ &.fui-dialog-actions-center {
127
+ justify-content: center;
128
+ }
129
+
130
+ // Space between actions (first left, rest right)
131
+ &.fui-dialog-actions-between {
132
+ justify-content: space-between;
133
+ }
134
+ }
135
+
136
+ // Close button utility class
137
+ .fui-dialog-close {
138
+ position: absolute;
139
+ top: var(--fui-dialog-close-top, 8px);
140
+ right: var(--fui-dialog-close-right, 8px);
141
+ cursor: pointer;
142
+ background: transparent;
143
+ border: none;
144
+ padding: var(--fui-padding-8);
145
+ border-radius: var(--fui-border-radius-pill);
146
+ display: flex;
147
+ align-items: center;
148
+ justify-content: center;
149
+ color: var(--fui-dialog-close-color, var(--fui-black-50));
150
+ transition: background-color var(--fui-duration-moderate-01) var(--fui-ease-standard);
151
+
152
+ &:hover {
153
+ background-color: var(--fui-dialog-close-hover-bg, var(--fui-black-5));
154
+ }
155
+
156
+ &:focus {
157
+ outline: none;
158
+ background-color: var(--fui-dialog-close-focus-bg, var(--fui-black-10));
159
+ }
160
+ }
161
+
162
+ // Responsive adjustments
163
+ @media screen and (max-width: 599px) {
164
+ .fui-dialog-panel {
165
+ max-width: calc(100vw - 32px) !important;
166
+ max-height: calc(100vh - 32px) !important;
167
+ }
168
+
169
+ .fui-dialog-title {
170
+ padding: var(--fui-dialog-title-padding-mobile, 16px 16px 0);
171
+ }
172
+
173
+ .fui-dialog-content {
174
+ padding: var(--fui-dialog-content-padding-mobile, 16px);
175
+ }
176
+
177
+ .fui-dialog-actions {
178
+ padding: var(--fui-dialog-actions-padding-mobile, 8px 16px 16px);
179
+ }
180
+ }
@@ -0,0 +1,87 @@
1
+ @use '../constants' as *;
2
+ @use '../mixins' as mixins;
3
+
4
+ // Overlay pane base styles
5
+ .fui-overlay-pane {
6
+ position: absolute;
7
+ pointer-events: auto;
8
+ box-sizing: border-box;
9
+ z-index: 2;
10
+ }
11
+
12
+ // Overlay backdrop styles
13
+ .fui-overlay-backdrop {
14
+ position: absolute;
15
+ top: 0;
16
+ left: 0;
17
+ width: 100%;
18
+ height: 100%;
19
+ pointer-events: auto;
20
+ background-color: transparent;
21
+ z-index: 1;
22
+ }
23
+
24
+ // Tooltip panel styles
25
+ .fui-tooltip-panel {
26
+ z-index: var(--fui-z-index-tooltip, 1100);
27
+
28
+ .fui-tooltip {
29
+ // Tooltip-specific overlay styles
30
+ max-width: var(--fui-tooltip-max-width, 200px);
31
+ }
32
+ }
33
+
34
+ // Menu panel styles
35
+ .fui-menu-panel {
36
+ z-index: var(--fui-z-index-dropdown, 1050);
37
+
38
+ .fui-menu {
39
+ // Menu-specific overlay styles
40
+ min-width: var(--fui-menu-min-width, 8rem);
41
+ max-width: var(--fui-menu-max-width, 20rem);
42
+ }
43
+
44
+ &--sm {
45
+ .fui-menu {
46
+ min-width: var(--fui-menu-min-width-sm, 6rem);
47
+ }
48
+ }
49
+
50
+ &--lg {
51
+ .fui-menu {
52
+ min-width: var(--fui-menu-min-width-lg, 12rem);
53
+ }
54
+ }
55
+ }
56
+
57
+ // Menu backdrop styles
58
+ .fui-menu-backdrop {
59
+ background-color: transparent;
60
+ }
61
+
62
+ // Animation classes for overlays
63
+ .fui-overlay-enter {
64
+ opacity: 0;
65
+ transform: scale(0.95);
66
+ transition:
67
+ opacity var(--fui-duration-fast-02) var(--fui-ease-standard),
68
+ transform var(--fui-duration-fast-02) var(--fui-ease-standard);
69
+ }
70
+
71
+ .fui-overlay-enter-active {
72
+ opacity: 1;
73
+ transform: scale(1);
74
+ }
75
+
76
+ .fui-overlay-exit {
77
+ opacity: 1;
78
+ transform: scale(1);
79
+ transition:
80
+ opacity var(--fui-duration-fast-01) var(--fui-ease-standard),
81
+ transform var(--fui-duration-fast-01) var(--fui-ease-standard);
82
+ }
83
+
84
+ .fui-overlay-exit-active {
85
+ opacity: 0;
86
+ transform: scale(0.95);
87
+ }