@genesislcap/foundation-forms 14.480.0 → 14.481.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.
@@ -989,7 +989,7 @@
989
989
  "type": {
990
990
  "text": "array"
991
991
  },
992
- "default": "[\n fallbackEntry,\n stringEntry,\n BooleanControlEntry,\n LayoutVertical2ColumnsEntry,\n LayoutRendererEntry,\n FilterNumberControlRendererEntry,\n ConnectedMultiselectControlRendererEntry,\n EnumControlRendererEntry,\n ConnectedSelectControlRendererEntry,\n FilterDateControlRendererEntry,\n FilterTimeControlRendererEntry,\n InvisibleControlEntry,\n]",
992
+ "default": "[\n fallbackEntry,\n stringEntry,\n BooleanControlEntry,\n LayoutVertical2ColumnsEntry,\n LayoutHorizontalEntry,\n LayoutRendererEntry,\n FilterNumberControlRendererEntry,\n ConnectedMultiselectControlRendererEntry,\n EnumControlRendererEntry,\n ConnectedSelectControlRendererEntry,\n FilterDateControlRendererEntry,\n FilterTimeControlRendererEntry,\n InvisibleControlEntry,\n]",
993
993
  "description": "Set of default renderers used by the foundation-filters.",
994
994
  "privacy": "public"
995
995
  },
@@ -1035,7 +1035,7 @@
1035
1035
  "type": {
1036
1036
  "text": "boolean"
1037
1037
  },
1038
- "description": "Controls the visibility of the filter persistence controls UI.",
1038
+ "description": "Controls the visibility of the filter persistence controls UI.\nWhen enabled, shows saved-filter select plus save/delete (KV storage).\nCustomize layout from outside via `::part(filter-persistence-controls-container)` or\n`--filter-persistence-controls-container-height` on the host.",
1039
1039
  "privacy": "public"
1040
1040
  },
1041
1041
  {
@@ -1052,13 +1052,22 @@
1052
1052
  "description": "UI schema used to define configuration of the layout and elements in the filters\nCheck UiSchema for possible options.",
1053
1053
  "privacy": "public"
1054
1054
  },
1055
+ {
1056
+ "kind": "method",
1057
+ "name": "uischemaChanged"
1058
+ },
1059
+ {
1060
+ "kind": "method",
1061
+ "name": "syncLayoutDirection",
1062
+ "privacy": "private"
1063
+ },
1055
1064
  {
1056
1065
  "kind": "field",
1057
1066
  "name": "renderers",
1058
1067
  "type": {
1059
1068
  "text": "RendererEntry[]"
1060
1069
  },
1061
- "default": "[\n fallbackEntry,\n stringEntry,\n BooleanControlEntry,\n LayoutVertical2ColumnsEntry,\n LayoutRendererEntry,\n FilterNumberControlRendererEntry,\n ConnectedMultiselectControlRendererEntry,\n EnumControlRendererEntry,\n ConnectedSelectControlRendererEntry,\n FilterDateControlRendererEntry,\n FilterTimeControlRendererEntry,\n InvisibleControlEntry,\n]",
1070
+ "default": "[\n fallbackEntry,\n stringEntry,\n BooleanControlEntry,\n LayoutVertical2ColumnsEntry,\n LayoutHorizontalEntry,\n LayoutRendererEntry,\n FilterNumberControlRendererEntry,\n ConnectedMultiselectControlRendererEntry,\n EnumControlRendererEntry,\n ConnectedSelectControlRendererEntry,\n FilterDateControlRendererEntry,\n FilterTimeControlRendererEntry,\n InvisibleControlEntry,\n]",
1062
1071
  "description": "Allows to provide the main set of renderers used by the form. If not provided, the built-in renderers will be used by default.",
1063
1072
  "privacy": "public"
1064
1073
  },
@@ -1373,7 +1382,7 @@
1373
1382
  "type": {
1374
1383
  "text": "boolean"
1375
1384
  },
1376
- "description": "Controls the visibility of the filter persistence controls UI.",
1385
+ "description": "Controls the visibility of the filter persistence controls UI.\nWhen enabled, shows saved-filter select plus save/delete (KV storage).\nCustomize layout from outside via `::part(filter-persistence-controls-container)` or\n`--filter-persistence-controls-container-height` on the host.",
1377
1386
  "fieldName": "showFilterPersistenceControls"
1378
1387
  },
1379
1388
  {
@@ -396,6 +396,9 @@ export declare class Filters extends Filters_base {
396
396
  allSavedFilters: any[];
397
397
  /**
398
398
  * Controls the visibility of the filter persistence controls UI.
399
+ * When enabled, shows saved-filter select plus save/delete (KV storage).
400
+ * Customize layout from outside via `::part(filter-persistence-controls-container)` or
401
+ * `--filter-persistence-controls-container-height` on the host.
399
402
  * @public
400
403
  */
401
404
  showFilterPersistenceControls: boolean;
@@ -443,6 +446,18 @@ export declare class Filters extends Filters_base {
443
446
  * @public
444
447
  */
445
448
  uischema: UiSchema;
449
+ /**
450
+ * Reflects the root UI schema layout so filter chrome (scroll vs fixed actions) can adapt.
451
+ * @internal
452
+ */
453
+ layoutDirection: 'vertical' | 'horizontal';
454
+ uischemaChanged(): void;
455
+ /**
456
+ * Root UI schema layout; used for container chrome (scroll axis, action placement).
457
+ * @internal
458
+ */
459
+ get layoutMode(): 'vertical' | 'horizontal';
460
+ private syncLayoutDirection;
446
461
  /**
447
462
  * Allows to provide the main set of renderers used by the form. If not provided, the built-in renderers will be used by default.
448
463
  * @public
@@ -1 +1 @@
1
- {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/filters/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAOnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY1C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAMnD,gBAAgB;AAChB,eAAO,MAAM,aAAa,iDAAqC,CAAC;AAchE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,OAa5B,CAAC;;;;;;;kBAMgC,CAAC;;;;;;;;8BAsDd,CAAC,cAChB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAqCG,CAAC;4IAQmE,CAAC;wFAI5E,CAAC;+IAIoD,CAAC;2FAGvB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA8CZ,CAAC;;;;;;;;;;;;;;;;;;;;;;;mBAqFE,CAAC;;;;;;;;;;;;;6BAkCV,CAAC;8BAIV,CAAP;kBACyB,CAAC;;oBAET,CAAC;;sBAEM,CAAC;oBAGhB,CAAT;;;;;;;;gDAgBY,CAAC;;;;;;;;;;;;;;;;;;uBAoBoL,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4EAAiiH,CAAC;yBAA8E,CAAC;UAAoD,GAAG;WAAgD,GAAG;;gBAA6E,GAAG;;;;;;;WAA4V,GAAG;YAAiD,GAAG;;;;;;;;;;;oBAAupC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAiiO,CAAC;cAA6F,CAAC;eAA8F,CAAC;gBAA+F,CAAC;;;;;;;;;;;;;;SAAulC,CAAC;;;iBAA+E,CAAC;;AArUlgc;;;;;;;;GAQG;AACH,qBAMa,OAAQ,SAAQ,YAAiC;IACjD,SAAS,EAAE,SAAS,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IAE/B;;;;OAIG;IACG,YAAY,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,GAAG,EAAE,CAAM;IAExC;;;OAGG;IAEH,6BAA6B,EAAE,OAAO,CAAC;YAEzB,mBAAmB;IAkBjC;;OAEG;IACI,gBAAgB;IAMvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqCG;IACS,QAAQ,EAAE,QAAQ,CAAC;IAC/B;;;OAGG;IACS,SAAS,EAAE,aAAa,EAAE,CAAoB;IAC1D;;;;;;OAMG;IACS,UAAU,EAAE,WAAW,CAAC;IACpC;;;OAGG;IAC0C,MAAM,EAAE,MAAM,CAAW;IAE7D,OAAO,CAAC,OAAO,CAAW;IACnC;;;OAGG;IACS,IAAI,EAAE,GAAG,CAAM;IAC3B;;;OAGG;IACS,KAAK,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,YAAY;IAIZ;;OAEG;IACM,SAAS,IAAI,IAAI;IAY1B;;OAEG;IACG,aAAa;IAmCnB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW;IAOrB,UAAU;IA0CV,YAAY;IA4BZ,iBAAiB;IAOjB,mBAAmB;IAsBzB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAW9C,cAAc,CAAC,SAAS,EAAE,MAAM;CAcvC"}
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/filters/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAOnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAa1C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAMnD,gBAAgB;AAChB,eAAO,MAAM,aAAa,iDAAqC,CAAC;AAchE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,OAc5B,CAAC;;;;;;;kBAEmB,CAAC;;;;;;;;8BA8CZ,CAAD,cACD,CAAF;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAwCK,CAAL;4IAKH,CAAF;wFAKc,CAAC;+IAUmE,CAAA;2FAMjF,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAmCiB,CAAA;;;;;;;;;;;;;;;;;;;;;;;mBAsFf,CAAD;;;;;;;;;;;;;6BA6BS,CAAD;8BAIL,CAAN;kBAKgB,CAAA;;oBAGV,CAAN;;sBAIM,CAAD;oBAEgB,CAAC;;;;;;;;gDAqBH,CAAC;;;;;;;;;;;;;;;;;;uBA2Be,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4EA0BmvF,CAAC;yBAA8E,CAAC;UAAoD,GAAG;WAAgD,GAAG;;gBAA6E,GAAG;;;;;;;WAA4V,GAAG;YAAiD,GAAG;;;;;;;;;;;oBAAupC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAiiO,CAAC;cAA6F,CAAC;eAA8F,CAAC;gBAA+F,CAAC;;;;;;;;;;;;;;SAAulC,CAAC;;;iBAA+E,CAAC;;AAhWrja;;;;;;;;GAQG;AACH,qBAKa,OAAQ,SAAQ,YAAiC;IACjD,SAAS,EAAE,SAAS,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IAE/B;;;;OAIG;IACG,YAAY,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,GAAG,EAAE,CAAM;IAExC;;;;;;OAMG;IAEH,6BAA6B,EAAE,OAAO,CAAC;YAEzB,mBAAmB;IAkBjC;;OAEG;IACI,gBAAgB;IAMvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqCG;IACS,QAAQ,EAAE,QAAQ,CAAC;IAE/B;;;OAGG;IAEH,eAAe,EAAE,UAAU,GAAG,YAAY,CAAc;IAExD,eAAe;IAIf;;;OAGG;IACH,IAAI,UAAU,IAAI,UAAU,GAAG,YAAY,CAE1C;IAED,OAAO,CAAC,mBAAmB;IAI3B;;;OAGG;IACS,SAAS,EAAE,aAAa,EAAE,CAAoB;IAC1D;;;;;;OAMG;IACS,UAAU,EAAE,WAAW,CAAC;IACpC;;;OAGG;IAC0C,MAAM,EAAE,MAAM,CAAW;IAE7D,OAAO,CAAC,OAAO,CAAW;IACnC;;;OAGG;IACS,IAAI,EAAE,GAAG,CAAM;IAC3B;;;OAGG;IACS,KAAK,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,YAAY;IAIZ;;OAEG;IACM,SAAS,IAAI,IAAI;IAY1B;;OAEG;IACG,aAAa;IAmCnB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW;IAOrB,UAAU;IA0CV,YAAY;IA4BZ,iBAAiB;IAQjB,mBAAmB;IAsBzB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAW9C,cAAc,CAAC,SAAS,EAAE,MAAM;CAcvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"filters.styles.d.ts","sourceRoot":"","sources":["../../../src/filters/filters.styles.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,uBAAuB,iDA4FnC,CAAC"}
1
+ {"version":3,"file":"filters.styles.d.ts","sourceRoot":"","sources":["../../../src/filters/filters.styles.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,uBAAuB,iDAgRnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"filters.template.d.ts","sourceRoot":"","sources":["../../../src/filters/filters.template.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,gBAAgB;AAChB,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,iEAoFhD,CAAC;AAEF,gBAAgB;AAChB,eAAO,MAAM,yBAAyB,8DAErC,CAAC"}
1
+ {"version":3,"file":"filters.template.d.ts","sourceRoot":"","sources":["../../../src/filters/filters.template.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,gBAAgB;AAChB,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,iEAwFhD,CAAC;AAEF,gBAAgB;AAChB,eAAO,MAAM,yBAAyB,8DAErC,CAAC"}
@@ -15,6 +15,7 @@ import { FilterDateControlRendererEntry } from '../jsonforms/renderers/FilterDat
15
15
  import { FilterNumberControlRendererEntry } from '../jsonforms/renderers/FilterNumberControlRenderer';
16
16
  import { FilterTimeControlRendererEntry } from '../jsonforms/renderers/FilterTimeControlRenderer';
17
17
  import { InvisibleControlEntry } from '../jsonforms/renderers/InvisibleControlRenderer';
18
+ import { LayoutHorizontalEntry } from '../jsonforms/renderers/LayoutHorizontalRenderer';
18
19
  import { LayoutRendererEntry } from '../jsonforms/renderers/LayoutRenderer';
19
20
  import { LayoutVertical2ColumnsEntry } from '../jsonforms/renderers/LayoutVertical2ColumnsRenderer';
20
21
  import { StringControlRendererTemplate } from '../jsonforms/renderers/StringControlRenderer';
@@ -43,6 +44,7 @@ export const filtersRenderers = [
43
44
  stringEntry,
44
45
  BooleanControlEntry,
45
46
  LayoutVertical2ColumnsEntry,
47
+ LayoutHorizontalEntry,
46
48
  LayoutRendererEntry,
47
49
  FilterNumberControlRendererEntry,
48
50
  ConnectedMultiselectControlRendererEntry,
@@ -67,6 +69,11 @@ let Filters = class Filters extends LifecycleMixin(FoundationElement) {
67
69
  constructor() {
68
70
  super(...arguments);
69
71
  this.allSavedFilters = [];
72
+ /**
73
+ * Reflects the root UI schema layout so filter chrome (scroll vs fixed actions) can adapt.
74
+ * @internal
75
+ */
76
+ this.layoutDirection = 'vertical';
70
77
  /**
71
78
  * Allows to provide the main set of renderers used by the form. If not provided, the built-in renderers will be used by default.
72
79
  * @public
@@ -107,6 +114,20 @@ let Filters = class Filters extends LifecycleMixin(FoundationElement) {
107
114
  this.value = '';
108
115
  this.filterName = '';
109
116
  }
117
+ uischemaChanged() {
118
+ this.syncLayoutDirection();
119
+ }
120
+ /**
121
+ * Root UI schema layout; used for container chrome (scroll axis, action placement).
122
+ * @internal
123
+ */
124
+ get layoutMode() {
125
+ var _a;
126
+ return ((_a = this.uischema) === null || _a === void 0 ? void 0 : _a.type) === 'HorizontalLayout' ? 'horizontal' : 'vertical';
127
+ }
128
+ syncLayoutDirection() {
129
+ this.layoutDirection = this.layoutMode;
130
+ }
110
131
  /**
111
132
  * @internal
112
133
  */
@@ -236,6 +257,7 @@ let Filters = class Filters extends LifecycleMixin(FoundationElement) {
236
257
  });
237
258
  return __awaiter(this, void 0, void 0, function* () {
238
259
  _super.connectedCallback.call(this);
260
+ this.syncLayoutDirection();
239
261
  if (this.showFilterPersistenceControls) {
240
262
  yield this.loadAllSavedFilters();
241
263
  }
@@ -313,6 +335,9 @@ __decorate([
313
335
  __decorate([
314
336
  observable
315
337
  ], Filters.prototype, "uischema", void 0);
338
+ __decorate([
339
+ attr({ attribute: 'layout-direction' })
340
+ ], Filters.prototype, "layoutDirection", void 0);
316
341
  __decorate([
317
342
  observable
318
343
  ], Filters.prototype, "renderers", void 0);
@@ -336,7 +361,6 @@ Filters = __decorate([
336
361
  name: 'foundation-filters',
337
362
  template,
338
363
  styles,
339
- shadowOptions: null,
340
364
  })
341
365
  ], Filters);
342
366
  export { Filters };
@@ -4,92 +4,272 @@ import { forcedColorsStylesheetBehavior } from '@microsoft/fast-foundation';
4
4
  import { SystemColors } from '@microsoft/fast-web-utilities';
5
5
  import { controlWrapperStylesFor } from '../jsonforms/renderers/ControlWrapperRenderer';
6
6
  export const foundationFiltersStyles = css `
7
- ${controlWrapperStylesFor('foundation-filters')}
7
+ ${controlWrapperStylesFor(':host')}
8
8
 
9
- foundation-filters {
9
+ :host {
10
10
  display: flex;
11
+ flex-direction: column;
11
12
  height: 100%;
12
13
  width: 100%;
13
14
  border: calc(${strokeWidth} * 1px) solid transparent;
14
15
  margin: 0;
15
16
  border-radius: calc(${controlCornerRadius} * 1px);
16
17
  min-width: 64px;
18
+ min-height: 0;
19
+ overflow: hidden;
17
20
 
18
21
  --filter-persistence-controls-container-height: 145px;
22
+ --filter-horizontal-field-min-width: calc(var(--design-unit) * 30px);
23
+ --filter-forms-padding-inline: calc(var(--design-unit) * 4px);
24
+ --filter-forms-padding-scroll-end: calc(var(--design-unit) * 6px);
19
25
  }
20
26
 
21
- foundation-filters .header {
27
+ .header {
22
28
  padding: calc(var(--design-unit) * 4px);
23
29
  }
24
30
 
25
- foundation-filters .header h2 {
31
+ .header h2 {
26
32
  margin: 0;
27
33
  }
28
34
 
29
- foundation-filters .container {
35
+ .container {
30
36
  width: 100%;
31
37
  display: flex;
32
38
  flex-direction: column;
39
+ flex: 1;
40
+ min-height: 0;
41
+ overflow: hidden;
33
42
  }
34
43
 
35
- foundation-filters .container-forms {
44
+ .container-body {
45
+ display: flex;
36
46
  overflow: hidden;
37
- overflow-y: scroll;
47
+ }
48
+
49
+ .container-forms {
50
+ --foundation-filters-scrollbar-thumb: var(--neutral-layer-2);
51
+ }
52
+
53
+ /* Vertical root layout: fields scroll, actions pinned below */
54
+ .container-body.vertical {
55
+ flex: 1;
56
+ flex-direction: column;
57
+ min-height: 0;
58
+ }
59
+
60
+ .container-body.vertical .container-forms {
38
61
  display: flex;
62
+ flex-direction: column;
63
+ align-items: stretch;
64
+ flex: 1;
65
+ min-height: 0;
66
+ overflow-x: hidden;
67
+ overflow-y: auto;
68
+ scrollbar-gutter: stable;
69
+ scrollbar-width: thin;
70
+ scrollbar-color: var(--foundation-filters-scrollbar-thumb) var(--neutral-layer-4);
71
+ }
72
+
73
+ .container-body.vertical .container-forms::-webkit-scrollbar {
74
+ width: calc((var(--base-height-multiplier) + var(--design-unit)) * 1px);
75
+ }
76
+
77
+ .container-body.vertical .container-forms::-webkit-scrollbar-track {
78
+ background: var(--neutral-layer-4);
39
79
  }
40
80
 
41
- foundation-filters .container-forms json-forms {
81
+ .container-body.vertical .container-forms::-webkit-scrollbar-thumb {
82
+ background-color: var(--foundation-filters-scrollbar-thumb);
83
+ border-radius: calc(${controlCornerRadius} * 1px);
84
+ }
85
+
86
+ /* Horizontal root layout: fields scroll sideways, actions on the right (same row) */
87
+ .container-body.horizontal {
88
+ flex: 0 1 auto;
89
+ flex-direction: row;
90
+ align-items: flex-end;
42
91
  width: 100%;
43
- padding: 0 15px;
92
+ min-height: 0;
93
+ }
94
+
95
+ .container-body.horizontal .container-forms {
96
+ display: flex;
97
+ flex: 1 1 auto;
98
+ min-width: 0;
99
+ overflow-x: auto;
100
+ overflow-y: hidden;
101
+ scrollbar-width: thin;
102
+ scrollbar-color: var(--foundation-filters-scrollbar-thumb) var(--neutral-layer-4);
103
+ }
104
+
105
+ .container-body.horizontal .container-forms::-webkit-scrollbar {
106
+ height: calc((var(--base-height-multiplier) + var(--design-unit)) * 1px);
107
+ }
108
+
109
+ .container-body.horizontal .container-forms::-webkit-scrollbar-track {
110
+ background: var(--neutral-layer-4);
111
+ }
112
+
113
+ .container-body.horizontal .container-forms::-webkit-scrollbar-thumb {
114
+ background-color: var(--foundation-filters-scrollbar-thumb);
115
+ border-radius: calc(${controlCornerRadius} * 1px);
116
+ }
117
+
118
+ /*
119
+ * Opt-in: host class filters-dropdown-overflow lets absolutely-positioned popups
120
+ * (e.g. the multiselect dropdown) paint outside the filter card instead of being clipped.
121
+ * This trades away field scrolling for that instance, so only use it on short filter bars.
122
+ */
123
+ :host(.filters-dropdown-overflow),
124
+ :host(.filters-dropdown-overflow) .container,
125
+ :host(.filters-dropdown-overflow) .container-body,
126
+ :host(.filters-dropdown-overflow) .container-body.vertical .container-forms,
127
+ :host(.filters-dropdown-overflow) .container-body.horizontal .container-forms {
128
+ overflow: visible;
129
+ }
130
+
131
+ /*
132
+ * With scrolling disabled (overflow: visible), the vertical fields area must size to
133
+ * its content so the pinned actions flow below it instead of the fields overflowing
134
+ * their flex box and painting on top of the actions.
135
+ */
136
+ :host(.filters-dropdown-overflow) .container-body.vertical .container-forms {
137
+ flex: 0 0 auto;
138
+ }
139
+
140
+ .container-forms json-forms {
141
+ width: 100%;
142
+ padding: 0 var(--filter-forms-padding-inline);
143
+ box-sizing: border-box;
144
+ display: flex;
145
+ flex-direction: column;
146
+ align-items: stretch;
147
+ min-width: 0;
44
148
  }
45
149
 
46
- foundation-filters .label {
150
+ .container-body.vertical .container-forms json-forms {
151
+ flex: 1 1 auto;
152
+ min-height: 0;
153
+ padding-right: var(--filter-forms-padding-scroll-end);
154
+ }
155
+
156
+ json-forms .clipboard-button {
157
+ align-self: flex-start;
158
+ }
159
+
160
+ dispatch-renderer {
161
+ display: block;
162
+ width: 100%;
163
+ min-width: 0;
164
+ }
165
+
166
+ .fl-vertical-layout {
167
+ display: flex;
168
+ flex-direction: column;
169
+ width: 100%;
170
+ align-items: stretch;
171
+ }
172
+
173
+ .foundation-control-wrapper-root {
174
+ width: 100%;
175
+ box-sizing: border-box;
176
+ }
177
+
178
+ .foundation-control-wrapper {
179
+ flex: 1 1 auto;
180
+ min-width: 0;
181
+ }
182
+
183
+ .container-body.horizontal .container-forms json-forms {
184
+ width: 100%;
185
+ min-width: 0;
186
+ flex: 1 1 auto;
187
+ }
188
+
189
+ .fl-horizontal-layout {
190
+ display: flex;
191
+ flex-direction: row;
192
+ gap: calc(${designUnit} * 2px);
193
+ }
194
+
195
+ .fl-horizontal-layout-item {
196
+ flex: 1;
197
+ min-width: 0;
198
+ }
199
+
200
+ .container-body.horizontal .fl-horizontal-layout {
201
+ flex-wrap: nowrap;
202
+ width: 100%;
203
+ min-width: min-content;
204
+ align-items: flex-end;
205
+ }
206
+
207
+ .container-body.horizontal .fl-horizontal-layout-item {
208
+ flex: 1 1 0;
209
+ min-width: var(--filter-horizontal-field-min-width);
210
+ }
211
+
212
+ .label {
47
213
  font-size: calc(${designUnit} * 1px + 0.7vmin);
48
214
  }
49
215
 
50
- foundation-filters .actions {
216
+ .actions {
51
217
  display: flex;
52
218
  flex-direction: row;
53
219
  align-items: flex-start;
54
220
  justify-content: flex-end;
55
221
  padding: calc(${designUnit} * 4px);
56
222
  gap: calc(${designUnit} * 2px);
223
+ flex-shrink: 0;
224
+ }
225
+
226
+ .container-body.horizontal .actions {
227
+ flex-direction: row;
228
+ justify-content: flex-start;
229
+ align-items: center;
230
+ align-self: flex-end;
231
+ padding: 0 calc(${designUnit} * 4px) calc(${designUnit} * 4px);
232
+ }
233
+
234
+ .action-button {
235
+ width: 70px;
57
236
  }
58
237
 
59
- foundation-filters .action-button {
238
+ .container-body.horizontal .action-button {
60
239
  width: 70px;
61
240
  }
62
241
 
63
- foundation-filters .filter-persistence-controls-container {
242
+ .filter-persistence-controls-container {
64
243
  display: flex;
65
244
  flex-direction: column;
66
245
  height: var(--filter-persistence-controls-container-height);
67
246
  padding: 5px 15px;
247
+ flex-shrink: 0;
68
248
  }
69
249
 
70
- foundation-filters .filter-persistence-controls {
250
+ .filter-persistence-controls {
71
251
  display: flex;
72
252
  flex-direction: column;
73
253
  width: 100%;
74
254
  padding-bottom: 10px;
75
255
  }
76
256
 
77
- foundation-filters .filter-persistence-controls > rapid-label {
257
+ .filter-persistence-controls > rapid-label {
78
258
  margin-bottom: calc(var(--design-unit) * 1px);
79
259
  color: var(--neutral-foreground-hint);
80
260
  }
81
261
 
82
- foundation-filters .filter-persistence-controls-components {
262
+ .filter-persistence-controls-components {
83
263
  display: flex;
84
264
  gap: 10px;
85
265
  }
86
266
 
87
- foundation-filters .filter-persistence-controls-components > rapid-button {
267
+ .filter-persistence-controls-components > rapid-button {
88
268
  width: 100px;
89
269
  justify-content: center;
90
270
  }
91
271
  `.withBehaviors(forcedColorsStylesheetBehavior(css `
92
- foundation-filters {
272
+ :host {
93
273
  background: ${SystemColors.Canvas};
94
274
  border-color: ${SystemColors.CanvasText};
95
275
  }
@@ -8,7 +8,10 @@ export const getPrefixedFilters = (prefix) => html `
8
8
  <template>
9
9
  <div class="container" part="container">
10
10
  ${when((x) => x.showFilterPersistenceControls, html `
11
- <div class="filter-persistence-controls-container">
11
+ <div
12
+ class="filter-persistence-controls-container"
13
+ part="filter-persistence-controls-container"
14
+ >
12
15
  <div class="filter-persistence-controls">
13
16
  <rapid-label>Saved Filters</rapid-label>
14
17
  <rapid-select :value=${sync((x) => x.filterName)}>
@@ -49,36 +52,37 @@ export const getPrefixedFilters = (prefix) => html `
49
52
  </div>
50
53
  <rapid-divider></rapid-divider>
51
54
  `)}
52
-
53
- <div class="container-forms" part="container-forms">
54
- <json-forms
55
- :renderers=${(x) => x.renderers}
56
- :uischema=${(x) => x.uischema}
57
- :schema=${(x) => x.jsonSchema}
58
- :data=${(x) => x.data}
59
- :prefix=${(x) => x.prefix}
60
- @data-change=${(x, c) => x.onChange(c.event)}
61
- ></json-forms>
62
- </div>
63
- <div class="actions" part="actions">
64
- <slot name="actions-start"></slot>
65
- <${prefix}-button
66
- @click="${(x) => x.clearFiltersData()}"
67
- class="action-button"
68
- appearance="neutral"
69
- data-test-id="clear-filters-button"
70
- >
71
- Clear
72
- </${prefix}-button>
73
- <${prefix}-button
74
- @click="${(x) => x.searchFilters()}"
75
- data-test-id="search-filters-button"
76
- class="action-button"
77
- appearance="accent"
78
- >
79
- Search
80
- </${prefix}-button>
81
- <slot name="actions-end"></slot>
55
+ <div class="${(x) => `container-body ${x.layoutMode}`}" part="container-body">
56
+ <div class="container-forms" part="container-forms">
57
+ <json-forms
58
+ :renderers=${(x) => x.renderers}
59
+ :uischema=${(x) => x.uischema}
60
+ :schema=${(x) => x.jsonSchema}
61
+ :data=${(x) => x.data}
62
+ :prefix=${(x) => x.prefix}
63
+ @data-change=${(x, c) => x.onChange(c.event)}
64
+ ></json-forms>
65
+ </div>
66
+ <div class="actions" part="actions">
67
+ <slot name="actions-start"></slot>
68
+ <${prefix}-button
69
+ @click="${(x) => x.clearFiltersData()}"
70
+ class="action-button"
71
+ appearance="neutral"
72
+ data-test-id="clear-filters-button"
73
+ >
74
+ Clear
75
+ </${prefix}-button>
76
+ <${prefix}-button
77
+ @click="${(x) => x.searchFilters()}"
78
+ data-test-id="search-filters-button"
79
+ class="action-button"
80
+ appearance="accent"
81
+ >
82
+ Search
83
+ </${prefix}-button>
84
+ <slot name="actions-end"></slot>
85
+ </div>
82
86
  </div>
83
87
  </div>
84
88
  </template>
@@ -1734,7 +1734,7 @@
1734
1734
  {
1735
1735
  "kind": "Property",
1736
1736
  "canonicalReference": "@genesislcap/foundation-forms!Filters#showFilterPersistenceControls:member",
1737
- "docComment": "/**\n * Controls the visibility of the filter persistence controls UI.\n *\n * @public\n */\n",
1737
+ "docComment": "/**\n * Controls the visibility of the filter persistence controls UI. When enabled, shows saved-filter select plus save/delete (KV storage). Customize layout from outside via `::part(filter-persistence-controls-container)` or `--filter-persistence-controls-container-height` on the host.\n *\n * @public\n */\n",
1738
1738
  "excerptTokens": [
1739
1739
  {
1740
1740
  "kind": "Content",
@@ -1792,6 +1792,37 @@
1792
1792
  "isProtected": false,
1793
1793
  "isAbstract": false
1794
1794
  },
1795
+ {
1796
+ "kind": "Method",
1797
+ "canonicalReference": "@genesislcap/foundation-forms!Filters#uischemaChanged:member(1)",
1798
+ "docComment": "",
1799
+ "excerptTokens": [
1800
+ {
1801
+ "kind": "Content",
1802
+ "text": "uischemaChanged(): "
1803
+ },
1804
+ {
1805
+ "kind": "Content",
1806
+ "text": "void"
1807
+ },
1808
+ {
1809
+ "kind": "Content",
1810
+ "text": ";"
1811
+ }
1812
+ ],
1813
+ "isStatic": false,
1814
+ "returnTypeTokenRange": {
1815
+ "startIndex": 1,
1816
+ "endIndex": 2
1817
+ },
1818
+ "releaseTag": "Public",
1819
+ "isProtected": false,
1820
+ "overloadIndex": 1,
1821
+ "parameters": [],
1822
+ "isOptional": false,
1823
+ "isAbstract": false,
1824
+ "name": "uischemaChanged"
1825
+ },
1795
1826
  {
1796
1827
  "kind": "Property",
1797
1828
  "canonicalReference": "@genesislcap/foundation-forms!Filters#value:member",
@@ -549,6 +549,9 @@ export declare class Filters extends Filters_base {
549
549
  allSavedFilters: any[];
550
550
  /**
551
551
  * Controls the visibility of the filter persistence controls UI.
552
+ * When enabled, shows saved-filter select plus save/delete (KV storage).
553
+ * Customize layout from outside via `::part(filter-persistence-controls-container)` or
554
+ * `--filter-persistence-controls-container-height` on the host.
552
555
  * @public
553
556
  */
554
557
  showFilterPersistenceControls: boolean;
@@ -596,6 +599,18 @@ export declare class Filters extends Filters_base {
596
599
  * @public
597
600
  */
598
601
  uischema: UiSchema;
602
+ /**
603
+ * Reflects the root UI schema layout so filter chrome (scroll vs fixed actions) can adapt.
604
+ * @internal
605
+ */
606
+ layoutDirection: 'vertical' | 'horizontal';
607
+ uischemaChanged(): void;
608
+ /**
609
+ * Root UI schema layout; used for container chrome (scroll axis, action placement).
610
+ * @internal
611
+ */
612
+ get layoutMode(): 'vertical' | 'horizontal';
613
+ private syncLayoutDirection;
599
614
  /**
600
615
  * Allows to provide the main set of renderers used by the form. If not provided, the built-in renderers will be used by default.
601
616
  * @public
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genesislcap/foundation-forms",
3
3
  "description": "Genesis Foundation Forms",
4
- "version": "14.480.0",
4
+ "version": "14.481.0",
5
5
  "sideEffects": false,
6
6
  "license": "SEE LICENSE IN license.txt",
7
7
  "main": "dist/esm/index.js",
@@ -59,13 +59,13 @@
59
59
  }
60
60
  },
61
61
  "devDependencies": {
62
- "@genesislcap/foundation-testing": "14.480.0",
63
- "@genesislcap/genx": "14.480.0",
64
- "@genesislcap/rollup-builder": "14.480.0",
65
- "@genesislcap/ts-builder": "14.480.0",
66
- "@genesislcap/uvu-playwright-builder": "14.480.0",
67
- "@genesislcap/vite-builder": "14.480.0",
68
- "@genesislcap/webpack-builder": "14.480.0",
62
+ "@genesislcap/foundation-testing": "14.481.0",
63
+ "@genesislcap/genx": "14.481.0",
64
+ "@genesislcap/rollup-builder": "14.481.0",
65
+ "@genesislcap/ts-builder": "14.481.0",
66
+ "@genesislcap/uvu-playwright-builder": "14.481.0",
67
+ "@genesislcap/vite-builder": "14.481.0",
68
+ "@genesislcap/webpack-builder": "14.481.0",
69
69
  "@types/json-schema": "^7.0.11",
70
70
  "@types/papaparse": "^5.3.14"
71
71
  },
@@ -82,12 +82,12 @@
82
82
  }
83
83
  },
84
84
  "dependencies": {
85
- "@genesislcap/foundation-comms": "14.480.0",
86
- "@genesislcap/foundation-criteria": "14.480.0",
87
- "@genesislcap/foundation-logger": "14.480.0",
88
- "@genesislcap/foundation-notifications": "14.480.0",
89
- "@genesislcap/foundation-ui": "14.480.0",
90
- "@genesislcap/foundation-utils": "14.480.0",
85
+ "@genesislcap/foundation-comms": "14.481.0",
86
+ "@genesislcap/foundation-criteria": "14.481.0",
87
+ "@genesislcap/foundation-logger": "14.481.0",
88
+ "@genesislcap/foundation-notifications": "14.481.0",
89
+ "@genesislcap/foundation-ui": "14.481.0",
90
+ "@genesislcap/foundation-utils": "14.481.0",
91
91
  "@json-schema-tools/dereferencer": "^1.6.1",
92
92
  "@jsonforms/core": "^3.2.1",
93
93
  "@microsoft/fast-components": "2.30.6",
@@ -109,5 +109,5 @@
109
109
  "access": "public"
110
110
  },
111
111
  "customElements": "dist/custom-elements.json",
112
- "gitHead": "6d2bc60f9700ab9f5a6d8c1834baebbd66ae5e6b"
112
+ "gitHead": "b04758f893b431ad94aa651341b27e85d6d5bdbc"
113
113
  }