mod-arch-kubeflow 1.5.0 → 1.8.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.
@@ -140,6 +140,9 @@
140
140
  --pf-t--global--border--color--status--success--default: var(--mui-palette-success-main);
141
141
  --pf-t--global--border--color--status--info--default: var(--mui-palette-info-main);
142
142
 
143
+ // MUI's warning background is darker than PF's default yellow, requiring white text for contrast
144
+ --pf-t--global--text--color--status--on-warning--default: var(--mui-palette-warning-contrastText);
145
+
143
146
  // ═══════════════════════════════════════════════════════════════════════════
144
147
  // MUI CUSTOM VARIABLES
145
148
  // Custom variables for MUI-specific values used in component overrides below.
@@ -166,6 +169,10 @@
166
169
  // Backdrop
167
170
  --mui-backdrop-BackgroundColor: rgba(0, 0, 0, 0.5);
168
171
 
172
+ // Switch - MUI/iOS-style switches use a pill shape (fully rounded ends)
173
+ // This preserves the capsule appearance while other components use the MUI border radius
174
+ --mui-switch--BorderRadius: 9999px;
175
+
169
176
  // Button
170
177
  --mui-button-FontWeight: 500;
171
178
  --mui-button--BorderWidth: var(--pf-t--global--border--width--regular);
@@ -194,6 +201,10 @@
194
201
  --mui-form-fieldset--LegendPadding: var(--mui-spacing-4px); // 4px horizontal padding
195
202
  --mui-form-fieldset--LegendFontSize: var(--pf-t--global--font--size--body--sm); // 0.75rem
196
203
 
204
+ // Form control border styling (MUI input defaults)
205
+ --mui-form-control--BorderWidth: 1px;
206
+ --mui-form-control--BorderColor: rgba(0, 0, 0, 0.23); // MUI standard input border
207
+
197
208
  // Helper text
198
209
  --mui-helper-text__item--FontWeight: 400;
199
210
 
@@ -286,6 +297,9 @@
286
297
  --mui-spacing-16px: calc(2 * var(--mui-spacing));
287
298
  --mui-spacing-32px: calc(4 * var(--mui-spacing));
288
299
 
300
+ // Input group control buttons (e.g. password toggle, mount path edit): compact circular button
301
+ --mui-input-group-control-button--size: 28px;
302
+ --mui-input-group-control-button--container-padding-inline-end: 6px;
289
303
 
290
304
  }
291
305
 
@@ -304,6 +318,12 @@
304
318
  ╚════════════════════════════════════════════════════════════════════════════════╝
305
319
  */
306
320
 
321
+ // PF table: opt-in vertical-align middle for tables with mixed content (text + controls).
322
+ // Add class mui-table-cells-middle to the Table when rows have inputs/buttons; keeps text-only tables on PF default.
323
+ .mui-theme .pf-v6-c-table.mui-table-cells-middle .pf-v6-c-table__td {
324
+ vertical-align: middle;
325
+ }
326
+
307
327
  .mui-theme .pf-v6-c-action-list__item .pf-v6-c-button {
308
328
  --pf-v6-c-button--PaddingInlineStart: 0;
309
329
  --pf-v6-c-button--PaddingInlineEnd: 0;
@@ -351,6 +371,8 @@
351
371
 
352
372
  .mui-theme .pf-v6-c-backdrop {
353
373
  --pf-v6-c-backdrop--BackgroundColor: var(--mui-backdrop-BackgroundColor);
374
+ // Sidebar uses MUI drawer z-index (1200); modal must render above it
375
+ --pf-v6-c-backdrop--ZIndex: var(--mui-zIndex-modal);
354
376
  }
355
377
 
356
378
  .mui-theme .pf-v6-c-brand.kubeflow_brand {
@@ -546,6 +568,44 @@
546
568
  border-radius: var(--pf-v6-c-form-control--BorderRadius, var(--mui-shape-borderRadius));
547
569
  }
548
570
 
571
+ // NumberInput uses a span.pf-v6-c-form-control, so it gets excluded by the :not(span) rule above.
572
+ // This adds the border specifically to NumberInput's form-control span.
573
+ // Uses PF component variables which inherit from global tokens set at :root
574
+ .mui-theme .pf-v6-c-number-input span.pf-v6-c-form-control {
575
+ border: var(--pf-v6-c-form-control--before--BorderWidth) solid var(--pf-v6-c-form-control--before--BorderColor);
576
+ box-sizing: border-box;
577
+
578
+ // Hover state - uses PF component hover variable
579
+ &:hover {
580
+ border-color: var(--pf-v6-c-form-control--hover--after--BorderColor);
581
+ }
582
+
583
+ // Focus state - use box-shadow to simulate thicker border without affecting layout
584
+ // Uses PF expanded (clicked) color which maps to primary/focus color
585
+ &:focus-within {
586
+ border-color: var(--pf-v6-c-form-control--m-expanded--after--BorderColor);
587
+ // Simulate 2px border with 1px border + 1px inset box-shadow
588
+ box-shadow: inset 0 0 0 1px var(--pf-v6-c-form-control--m-expanded--after--BorderColor);
589
+ }
590
+ }
591
+
592
+ // NumberInput layout fixes - ensure buttons fill full height and connect seamlessly
593
+ .mui-theme .pf-v6-c-number-input {
594
+ // Ensure consistent height
595
+ align-items: stretch;
596
+
597
+ .pf-v6-c-input-group__item {
598
+ display: flex;
599
+ align-items: stretch;
600
+ }
601
+
602
+ // Make buttons take full height of their container
603
+ .pf-v6-c-button {
604
+ height: 100%;
605
+ align-self: stretch;
606
+ }
607
+ }
608
+
549
609
  // Remove pseudo-element borders everywhere since we're using real borders now
550
610
  .mui-theme .pf-v6-c-form-control::after,
551
611
  .mui-theme .pf-v6-c-form-control::before {
@@ -668,6 +728,12 @@
668
728
  border-color: var(--mui-palette-action-disabled);
669
729
  }
670
730
 
731
+ // Hide menu-toggle's ::before pseudo-element border inside fieldset wrapper
732
+ // The fieldset wrapper provides the border, so we don't need the ::before border
733
+ .mui-theme .form-fieldset-wrapper .pf-v6-c-menu-toggle::before {
734
+ border: none;
735
+ }
736
+
671
737
  .mui-theme .form-fieldset-wrapper span.pf-v6-c-form-control.pf-m-error ~ .form-fieldset {
672
738
  border-color: var(--mui-palette-error-main);
673
739
  }
@@ -676,20 +742,71 @@
676
742
  border-color: var(--mui-palette-error-main);
677
743
  }
678
744
 
679
- .mui-theme .form-fieldset-wrapper .pf-v6-c-input-group__item button {
680
- // Aligns EyeIcon in password input
681
- --pf-v6-c-button--PaddingBlockStart: var(--mui-spacing-16px);
682
- --pf-v6-c-button--PaddingBlockEnd: var(--mui-spacing-16px);
683
- --pf-v6-c-button--BorderColor: var(--mui-palette-common-white);
684
- --pf-v6-c-button--BorderRadius: 50%;
745
+ // Input group control buttons: use PF structure only (Button variant="control" in InputGroup).
746
+ // No app class names required; any consumer using variant="control" gets this styling.
747
+ .mui-theme .pf-v6-c-input-group .pf-v6-c-input-group__item:has(.pf-v6-c-button.pf-m-control) {
748
+ display: flex;
749
+ align-items: center;
685
750
  }
686
751
 
687
- .mui-theme .form-fieldset-wrapper:focus-within .form-fieldset {
752
+ .mui-theme .pf-v6-c-input-group .pf-v6-c-input-group__item:has(.pf-v6-c-button.pf-m-control):last-child {
753
+ padding-inline-end: var(--mui-input-group-control-button--container-padding-inline-end);
754
+ }
755
+
756
+ .mui-theme .pf-v6-c-input-group .pf-v6-c-input-group__item .pf-v6-c-button.pf-m-control {
757
+ --pf-v6-c-button--BorderColor: transparent;
758
+ --pf-v6-c-button--hover--BorderColor: transparent;
759
+ --pf-v6-c-button--m-control--BorderColor: transparent;
760
+ --pf-v6-c-button--m-control--hover--BorderColor: transparent;
761
+ --pf-v6-c-button--m-control--m-clicked--BorderColor: transparent;
762
+ --pf-v6-c-button--PaddingBlockStart: 0;
763
+ --pf-v6-c-button--PaddingBlockEnd: 0;
764
+ --pf-v6-c-button--PaddingInlineStart: 0;
765
+ --pf-v6-c-button--PaddingInlineEnd: 0;
766
+ --pf-v6-c-button--m-control--BorderRadius: 50%;
767
+
768
+ width: var(--mui-input-group-control-button--size);
769
+ height: var(--mui-input-group-control-button--size);
770
+ min-width: var(--mui-input-group-control-button--size);
771
+ min-height: var(--mui-input-group-control-button--size);
772
+ border-radius: 50%;
773
+ display: inline-flex;
774
+ align-items: center;
775
+ justify-content: center;
776
+ line-height: 0;
777
+ align-self: center;
778
+ }
779
+
780
+ .mui-theme .pf-v6-c-input-group .pf-v6-c-input-group__item .pf-v6-c-button.pf-m-control .pf-v6-c-button__icon,
781
+ .mui-theme .pf-v6-c-input-group .pf-v6-c-input-group__item .pf-v6-c-button.pf-m-control svg {
782
+ display: block;
783
+ margin: 0;
784
+ }
785
+
786
+ .mui-theme .pf-v6-c-input-group .pf-v6-c-input-group__item .pf-v6-c-button.pf-m-control:hover {
787
+ border-radius: 50%;
788
+ outline: none;
789
+ background-color: var(--pf-t--global--background--color--action--plain--hover, rgba(0, 0, 0, 0.04));
790
+ }
791
+
792
+ .mui-theme .pf-v6-c-input-group .pf-v6-c-input-group__item .pf-v6-c-button.pf-m-control:focus-visible {
793
+ border-radius: 50%;
794
+ outline: none;
795
+ box-shadow: 0 0 0 2px var(--mui-palette-primary-main);
796
+ }
797
+
798
+ .mui-theme .form-fieldset-wrapper:focus-within:not(:has(.pf-m-error)) .form-fieldset {
688
799
  border-color: var(--mui-palette-primary-main);
689
800
  border-width: var(--mui-form--focus--BorderWidth);
690
801
  padding: var(--mui-form--focus--Padding) var(--mui-form--focus--Padding);
691
802
  }
692
803
 
804
+ .mui-theme .form-fieldset-wrapper:focus-within:has(.pf-m-error) .form-fieldset {
805
+ border-color: var(--mui-palette-error-main);
806
+ border-width: var(--mui-form--focus--BorderWidth);
807
+ padding: var(--mui-form--focus--Padding) var(--mui-form--focus--Padding);
808
+ }
809
+
693
810
  // Apply form-fieldset-wrapper styling to ANY descendant of .pf-v6-c-form (Form component)
694
811
  // This ensures styling works regardless of nesting depth or wrapper divs
695
812
  .mui-theme .pf-v6-c-form .form-fieldset {
@@ -751,16 +868,14 @@
751
868
  border-color: var(--mui-palette-error-main);
752
869
  }
753
870
 
754
- .mui-theme .pf-v6-c-form .form-fieldset-wrapper .pf-v6-c-input-group__item button {
755
- // Aligns EyeIcon in password input
756
- --pf-v6-c-button--PaddingBlockStart: var(--mui-spacing-16px);
757
- --pf-v6-c-button--PaddingBlockEnd: var(--mui-spacing-16px);
758
- --pf-v6-c-button--BorderColor: var(--mui-palette-common-white);
759
- --pf-v6-c-button--BorderRadius: 50%;
871
+ .mui-theme .pf-v6-c-form .form-fieldset-wrapper:focus-within:not(:has(.pf-m-error)) .form-fieldset {
872
+ border-color: var(--mui-palette-primary-main);
873
+ border-width: var(--mui-form--focus--BorderWidth);
874
+ padding: var(--mui-form--focus--Padding) var(--mui-form--focus--Padding);
760
875
  }
761
876
 
762
- .mui-theme .pf-v6-c-form .form-fieldset-wrapper:focus-within .form-fieldset {
763
- border-color: var(--mui-palette-primary-main);
877
+ .mui-theme .pf-v6-c-form .form-fieldset-wrapper:focus-within:has(.pf-m-error) .form-fieldset {
878
+ border-color: var(--mui-palette-error-main);
764
879
  border-width: var(--mui-form--focus--BorderWidth);
765
880
  padding: var(--mui-form--focus--Padding) var(--mui-form--focus--Padding);
766
881
  }
@@ -838,20 +953,19 @@
838
953
  border-color: var(--mui-palette-error-main);
839
954
  }
840
955
 
841
- .mui-theme [class*="pf-v6-l-"] .form-fieldset-wrapper .pf-v6-c-input-group__item button {
842
- // Aligns EyeIcon in password input
843
- --pf-v6-c-button--PaddingBlockStart: var(--pf-t--global--spacer--md);
844
- --pf-v6-c-button--PaddingBlockEnd: var(--pf-t--global--spacer--md);
845
- --pf-v6-c-button--BorderColor: var(--mui-palette-common-white);
846
- --pf-v6-c-button--BorderRadius: 50%;
847
- }
848
956
 
849
- .mui-theme [class*="pf-v6-l-"] .form-fieldset-wrapper:focus-within .form-fieldset {
957
+ .mui-theme [class*="pf-v6-l-"] .form-fieldset-wrapper:focus-within:not(:has(.pf-m-error)) .form-fieldset {
850
958
  border-color: var(--mui-palette-primary-main);
851
959
  border-width: var(--mui-form--focus--BorderWidth);
852
960
  padding: var(--mui-form--focus--Padding) var(--mui-form--focus--Padding);
853
961
  }
854
962
 
963
+ .mui-theme [class*="pf-v6-l-"] .form-fieldset-wrapper:focus-within:has(.pf-m-error) .form-fieldset {
964
+ border-color: var(--mui-palette-error-main);
965
+ border-width: var(--mui-form--focus--BorderWidth);
966
+ padding: var(--mui-form--focus--Padding) var(--mui-form--focus--Padding);
967
+ }
968
+
855
969
  .mui-theme [class*="pf-v6-l-"] .form-fieldset-wrapper:focus-within {
856
970
  color: var(--mui-palette-primary-main);
857
971
  }
@@ -954,12 +1068,18 @@
954
1068
  border-color: var(--mui-palette-common-black);
955
1069
  }
956
1070
 
957
- .mui-theme .pf-v6-c-expandable-section .form-fieldset-wrapper:focus-within .form-fieldset {
1071
+ .mui-theme .pf-v6-c-expandable-section .form-fieldset-wrapper:focus-within:not(:has(.pf-m-error)) .form-fieldset {
958
1072
  border-color: var(--mui-palette-primary-main);
959
1073
  border-width: var(--mui-form--focus--BorderWidth);
960
1074
  padding: var(--mui-form--focus--Padding) var(--mui-form--focus--Padding);
961
1075
  }
962
1076
 
1077
+ .mui-theme .pf-v6-c-expandable-section .form-fieldset-wrapper:focus-within:has(.pf-m-error) .form-fieldset {
1078
+ border-color: var(--mui-palette-error-main);
1079
+ border-width: var(--mui-form--focus--BorderWidth);
1080
+ padding: var(--mui-form--focus--Padding) var(--mui-form--focus--Padding);
1081
+ }
1082
+
963
1083
  .mui-theme .pf-v6-c-expandable-section .form-fieldset-wrapper:focus-within {
964
1084
  color: var(--mui-palette-primary-main);
965
1085
  }
@@ -996,7 +1116,8 @@
996
1116
  border-color: var(--mui-palette-primary-main);
997
1117
  }
998
1118
 
999
- .mui-theme .pf-v6-c-form-control.pf-m-error:not(span) {
1119
+ .mui-theme .pf-v6-c-form-control.pf-m-error:not(span),
1120
+ .mui-theme .pf-v6-c-number-input span.pf-v6-c-form-control.pf-m-error {
1000
1121
  border-color: var(--mui-palette-error-main);
1001
1122
  }
1002
1123
 
@@ -1050,6 +1171,12 @@
1050
1171
  --pf-v6-c-menu__item--FontSize: var(--mui-menu__item--FontSize);
1051
1172
  }
1052
1173
 
1174
+ // Remove negative margins on scrollable menu content that clip the scrollbar
1175
+ .mui-theme .pf-v6-c-menu.pf-m-scrollable .pf-v6-c-menu__content {
1176
+ margin-block-start: 0;
1177
+ margin-block-end: 0;
1178
+ }
1179
+
1053
1180
 
1054
1181
  .mui-theme .pf-v6-c-menu__item {
1055
1182
  &.pf-m-selected {
@@ -1078,6 +1205,7 @@
1078
1205
  --pf-v6-c-menu-toggle--expanded--Color: var(--mui-palette-common-black);
1079
1206
  --pf-v6-c-menu-toggle--hover--BorderColor: var(--mui-menu-toggle--hover--BorderColor);
1080
1207
  --pf-v6-c-menu-toggle--BorderColor: var(--mui-menu-toggle--BorderColor);
1208
+
1081
1209
  --pf-v6-c-menu-toggle--hover--BackgroundColor: var(
1082
1210
  --pf-t--global--background--color--action--plain--hover
1083
1211
  );
@@ -1136,12 +1264,15 @@
1136
1264
  --pf-v6-c-menu-toggle--m-secondary--Color: var(--mui-palette-primary-main);
1137
1265
  --pf-v6-c-menu-toggle--m-secondary--BorderColor: var(--mui-palette-primary-main);
1138
1266
  --pf-v6-c-menu-toggle--m-secondary--BackgroundColor: transparent;
1267
+ // Explicit border for secondary variant
1268
+ border-color: var(--mui-palette-primary-main);
1139
1269
 
1140
1270
  &:hover {
1141
1271
  --pf-v6-c-menu-toggle--m-secondary--hover--BorderColor: var(--mui-palette-primary-dark);
1142
1272
  --pf-v6-c-menu-toggle--m-secondary--hover--Color: var(--mui-palette-primary-dark);
1143
1273
  // No PF variable for secondary hover background; using direct CSS
1144
1274
  background-color: var(--mui-palette-action-hover);
1275
+ border-color: var(--mui-palette-primary-dark);
1145
1276
  }
1146
1277
 
1147
1278
  // Disabled state for secondary variant (higher specificity than base disabled)
@@ -1464,13 +1595,18 @@ left: 0;
1464
1595
  /* CSS workaround for spacing in labels in Workspace Kind */
1465
1596
  /* Special handling for form fields in table cells - remove extra top spacing */
1466
1597
  /* Layout properties (vertical-align, display, overflow) - no PF variables exist */
1467
- .mui-theme .form-label-field-group .pf-v6-c-table tr:where(.pf-v6-c-table__tr) > :where(th, td) {
1598
+ .mui-theme .form-label-field-group .pf-v6-c-table tr:where(.pf-v6-c-table__tr):not(.pf-v6-c-inline-edit) > :where(th, td) {
1468
1599
  /* Layout property - no PF variable exists */
1469
1600
  vertical-align: middle;
1470
1601
  /* Balance padding - use PF component variable for consistency */
1471
1602
  --pf-v6-c-table--cell--PaddingBlockStart: 0px;
1472
1603
  }
1473
1604
 
1605
+ /* Vertically center action cells (e.g. delete button) in inline edit rows to align with taller MUI form fields */
1606
+ .mui-theme .form-label-field-group .pf-v6-c-table tr.pf-v6-c-inline-edit.pf-m-inline-editable > td:last-child {
1607
+ vertical-align: middle;
1608
+ }
1609
+
1474
1610
  /* Remove spacing to align form elements at top of table cells */
1475
1611
  /* Margin/padding: No PF variables exist for zero values - using direct CSS */
1476
1612
  .mui-theme .form-label-field-group .pf-v6-c-table tr:where(.pf-v6-c-table__tr) > :where(th, td) .pf-v6-c-form__group {
@@ -1710,6 +1846,12 @@ left: 0;
1710
1846
  min-height: var(--kf-central-app-bar-height);
1711
1847
  }
1712
1848
 
1849
+ // Switch component - use pill-shaped border radius for the capsule appearance
1850
+ .mui-theme .pf-v6-c-switch {
1851
+ --pf-v6-c-switch__toggle--BorderRadius: var(--mui-switch--BorderRadius);
1852
+ --pf-v6-c-switch__toggle--before--BorderRadius: var(--mui-switch--BorderRadius);
1853
+ }
1854
+
1713
1855
  .mui-theme .pf-v6-c-modal-box {
1714
1856
  // BorderRadius inherited from --pf-t--global--border--radius--large (set to MUI shape-borderRadius)
1715
1857
  --pf-v6-c-modal-box--BoxShadow: var(--mui-shadows-24);
@@ -1907,14 +2049,6 @@ left: 0;
1907
2049
  }
1908
2050
  }
1909
2051
 
1910
- .mui-theme .workspacekind-file-upload {
1911
- height: 100%;
1912
-
1913
- .pf-v6-c-file-upload__file-details {
1914
- flex-grow: 1;
1915
- }
1916
- }
1917
-
1918
2052
  .mui-theme .pf-v6-c-toolbar__item.toolbar-fieldset-wrapper,
1919
2053
  .mui-theme .toolbar-fieldset-wrapper {
1920
2054
  position: relative;
@@ -1951,6 +2085,21 @@ left: 0;
1951
2085
  --pf-v6-c-menu-toggle--PaddingInlineEnd: 12px;
1952
2086
  }
1953
2087
 
2088
+ // Filter group menu-toggles - add border styling
2089
+ .mui-theme .pf-v6-c-toolbar__group.pf-m-filter-group .pf-v6-c-menu-toggle {
2090
+ // Use inset box-shadow for border effect to avoid layout shift
2091
+ box-shadow: inset 0 0 0 1px var(--mui-palette-grey-400);
2092
+ border-radius: var(--mui-shape-borderRadius);
2093
+
2094
+ &:hover {
2095
+ box-shadow: inset 0 0 0 1px var(--mui-palette-common-black);
2096
+ }
2097
+
2098
+ &.pf-m-expanded {
2099
+ box-shadow: none;
2100
+ }
2101
+ }
2102
+
1954
2103
  /* Only apply fixed width to filter dropdown in toolbar filter group */
1955
2104
  .mui-theme .pf-v6-c-toolbar__group.pf-m-filter-group .pf-v6-c-menu-toggle:not(.pf-m-split-button):not(.pf-m-plain) {
1956
2105
  --pf-v6-c-menu-toggle--MinWidth: 140px;
@@ -1969,20 +2118,16 @@ left: 0;
1969
2118
  --pf-v6-c-content--list--PaddingInlineStart: 0;
1970
2119
  }
1971
2120
 
1972
- .mui-theme .workspacekind-file-upload {
1973
- height: 100%;
2121
+ // File upload textarea border styling (MUI-specific)
2122
+ .mui-theme .pf-v6-c-file-upload__file-details .pf-v6-c-form-control.pf-m-textarea {
2123
+ border: var(--mui-form-control--BorderWidth) solid var(--mui-form-control--BorderColor);
2124
+ border-radius: var(--mui-shape-borderRadius);
1974
2125
 
1975
- .pf-v6-c-file-upload__file-details {
1976
- flex-grow: 1;
2126
+ &:hover {
2127
+ border-color: var(--mui-palette-common-black);
1977
2128
  }
1978
2129
  }
1979
2130
 
1980
- .mui-theme .pf-v6-c-file-upload {
1981
- height: 100%;
1982
- display: flex;
1983
- flex-direction: column;
1984
- }
1985
-
1986
2131
 
1987
2132
  /* Workaround for Toggle group header in Workspace Kind Form */
1988
2133
  .mui-theme .workspace-kind-form-header .pf-v6-c-toggle-group__button.pf-m-selected {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mod-arch-kubeflow",
3
- "version": "1.5.0",
3
+ "version": "1.8.0",
4
4
  "description": "Kubeflow-specific theme and UI components for modular architecture micro-frontend projects",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -10,7 +10,7 @@
10
10
  "*.scss"
11
11
  ],
12
12
  "engines": {
13
- "node": ">=20.0.0"
13
+ "node": ">=22.0.0"
14
14
  },
15
15
  "files": [
16
16
  "dist",