@genesislcap/foundation-forms 14.471.0 → 14.472.0-canary.fui-2558-v1

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;2FAIxC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAqC1C,CAAD;;;;;;;;;;;;;;;;;;;;;;;mBAoFK,CAAD;;;;;;;;;;;;;6BA8BmB,CAAC;8BAIZ,CAAC;kBAKS,CAAA;;oBAGA,CAAC;;sBAGG,CAAC;oBAItB,CAAF;;;;;;;;gDAqBA,CAAF;;;;;;;;;;;;;;;;;;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;;AAhWnia;;;;;;;;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,iDA0PnC,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', mode: 'fromView' })
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,250 @@ 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);
79
+ }
80
+
81
+ .container-body.vertical .container-forms::-webkit-scrollbar-thumb {
82
+ background-color: var(--foundation-filters-scrollbar-thumb);
83
+ border-radius: calc(${controlCornerRadius} * 1px);
39
84
  }
40
85
 
41
- foundation-filters .container-forms json-forms {
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;
91
+ width: 100%;
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
+ .container-forms json-forms {
42
119
  width: 100%;
43
- padding: 0 15px;
120
+ padding: 0 var(--filter-forms-padding-inline);
121
+ box-sizing: border-box;
122
+ display: flex;
123
+ flex-direction: column;
124
+ align-items: stretch;
125
+ min-width: 0;
126
+ }
127
+
128
+ .container-body.vertical .container-forms json-forms {
129
+ flex: 1 1 auto;
130
+ min-height: 0;
131
+ padding-right: var(--filter-forms-padding-scroll-end);
44
132
  }
45
133
 
46
- foundation-filters .label {
134
+ json-forms .clipboard-button {
135
+ align-self: flex-start;
136
+ }
137
+
138
+ dispatch-renderer {
139
+ display: block;
140
+ width: 100%;
141
+ min-width: 0;
142
+ }
143
+
144
+ .fl-vertical-layout {
145
+ display: flex;
146
+ flex-direction: column;
147
+ width: 100%;
148
+ align-items: stretch;
149
+ }
150
+
151
+ .foundation-control-wrapper-root {
152
+ width: 100%;
153
+ box-sizing: border-box;
154
+ }
155
+
156
+ .foundation-control-wrapper {
157
+ flex: 1 1 auto;
158
+ min-width: 0;
159
+ }
160
+
161
+ .container-body.horizontal .container-forms json-forms {
162
+ width: 100%;
163
+ min-width: 0;
164
+ flex: 1 1 auto;
165
+ }
166
+
167
+ .fl-horizontal-layout {
168
+ display: flex;
169
+ flex-direction: row;
170
+ gap: calc(${designUnit} * 2px);
171
+ }
172
+
173
+ .fl-horizontal-layout-item {
174
+ flex: 1;
175
+ min-width: 0;
176
+ }
177
+
178
+ .container-body.horizontal .fl-horizontal-layout {
179
+ flex-wrap: nowrap;
180
+ width: 100%;
181
+ min-width: min-content;
182
+ align-items: flex-end;
183
+ }
184
+
185
+ .container-body.horizontal .fl-horizontal-layout-item {
186
+ flex: 1 1 0;
187
+ min-width: var(--filter-horizontal-field-min-width);
188
+ }
189
+
190
+ .label {
47
191
  font-size: calc(${designUnit} * 1px + 0.7vmin);
48
192
  }
49
193
 
50
- foundation-filters .actions {
194
+ .actions {
51
195
  display: flex;
52
196
  flex-direction: row;
53
197
  align-items: flex-start;
54
198
  justify-content: flex-end;
55
199
  padding: calc(${designUnit} * 4px);
56
200
  gap: calc(${designUnit} * 2px);
201
+ flex-shrink: 0;
202
+ }
203
+
204
+ .container-body.horizontal .actions {
205
+ flex-direction: row;
206
+ justify-content: flex-start;
207
+ align-items: center;
208
+ align-self: flex-end;
209
+ padding: 0 calc(${designUnit} * 4px) calc(${designUnit} * 4px);
210
+ }
211
+
212
+ .action-button {
213
+ width: 70px;
57
214
  }
58
215
 
59
- foundation-filters .action-button {
216
+ .container-body.horizontal .action-button {
60
217
  width: 70px;
61
218
  }
62
219
 
63
- foundation-filters .filter-persistence-controls-container {
220
+ .filter-persistence-controls-container {
64
221
  display: flex;
65
222
  flex-direction: column;
66
223
  height: var(--filter-persistence-controls-container-height);
67
224
  padding: 5px 15px;
225
+ flex-shrink: 0;
68
226
  }
69
227
 
70
- foundation-filters .filter-persistence-controls {
228
+ .filter-persistence-controls {
71
229
  display: flex;
72
230
  flex-direction: column;
73
231
  width: 100%;
74
232
  padding-bottom: 10px;
75
233
  }
76
234
 
77
- foundation-filters .filter-persistence-controls > rapid-label {
235
+ .filter-persistence-controls > rapid-label {
78
236
  margin-bottom: calc(var(--design-unit) * 1px);
79
237
  color: var(--neutral-foreground-hint);
80
238
  }
81
239
 
82
- foundation-filters .filter-persistence-controls-components {
240
+ .filter-persistence-controls-components {
83
241
  display: flex;
84
242
  gap: 10px;
85
243
  }
86
244
 
87
- foundation-filters .filter-persistence-controls-components > rapid-button {
245
+ .filter-persistence-controls-components > rapid-button {
88
246
  width: 100px;
89
247
  justify-content: center;
90
248
  }
91
249
  `.withBehaviors(forcedColorsStylesheetBehavior(css `
92
- foundation-filters {
250
+ :host {
93
251
  background: ${SystemColors.Canvas};
94
252
  border-color: ${SystemColors.CanvasText};
95
253
  }
@@ -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",
@@ -543,6 +543,9 @@ export declare class Filters extends Filters_base {
543
543
  allSavedFilters: any[];
544
544
  /**
545
545
  * Controls the visibility of the filter persistence controls UI.
546
+ * When enabled, shows saved-filter select plus save/delete (KV storage).
547
+ * Customize layout from outside via `::part(filter-persistence-controls-container)` or
548
+ * `--filter-persistence-controls-container-height` on the host.
546
549
  * @public
547
550
  */
548
551
  showFilterPersistenceControls: boolean;
@@ -590,6 +593,18 @@ export declare class Filters extends Filters_base {
590
593
  * @public
591
594
  */
592
595
  uischema: UiSchema;
596
+ /**
597
+ * Reflects the root UI schema layout so filter chrome (scroll vs fixed actions) can adapt.
598
+ * @internal
599
+ */
600
+ layoutDirection: 'vertical' | 'horizontal';
601
+ uischemaChanged(): void;
602
+ /**
603
+ * Root UI schema layout; used for container chrome (scroll axis, action placement).
604
+ * @internal
605
+ */
606
+ get layoutMode(): 'vertical' | 'horizontal';
607
+ private syncLayoutDirection;
593
608
  /**
594
609
  * Allows to provide the main set of renderers used by the form. If not provided, the built-in renderers will be used by default.
595
610
  * @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.471.0",
4
+ "version": "14.472.0-canary.fui-2558-v1",
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.471.0",
63
- "@genesislcap/genx": "14.471.0",
64
- "@genesislcap/rollup-builder": "14.471.0",
65
- "@genesislcap/ts-builder": "14.471.0",
66
- "@genesislcap/uvu-playwright-builder": "14.471.0",
67
- "@genesislcap/vite-builder": "14.471.0",
68
- "@genesislcap/webpack-builder": "14.471.0",
62
+ "@genesislcap/foundation-testing": "14.472.0-canary.fui-2558-v1",
63
+ "@genesislcap/genx": "14.472.0-canary.fui-2558-v1",
64
+ "@genesislcap/rollup-builder": "14.472.0-canary.fui-2558-v1",
65
+ "@genesislcap/ts-builder": "14.472.0-canary.fui-2558-v1",
66
+ "@genesislcap/uvu-playwright-builder": "14.472.0-canary.fui-2558-v1",
67
+ "@genesislcap/vite-builder": "14.472.0-canary.fui-2558-v1",
68
+ "@genesislcap/webpack-builder": "14.472.0-canary.fui-2558-v1",
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.471.0",
86
- "@genesislcap/foundation-criteria": "14.471.0",
87
- "@genesislcap/foundation-logger": "14.471.0",
88
- "@genesislcap/foundation-notifications": "14.471.0",
89
- "@genesislcap/foundation-ui": "14.471.0",
90
- "@genesislcap/foundation-utils": "14.471.0",
85
+ "@genesislcap/foundation-comms": "14.472.0-canary.fui-2558-v1",
86
+ "@genesislcap/foundation-criteria": "14.472.0-canary.fui-2558-v1",
87
+ "@genesislcap/foundation-logger": "14.472.0-canary.fui-2558-v1",
88
+ "@genesislcap/foundation-notifications": "14.472.0-canary.fui-2558-v1",
89
+ "@genesislcap/foundation-ui": "14.472.0-canary.fui-2558-v1",
90
+ "@genesislcap/foundation-utils": "14.472.0-canary.fui-2558-v1",
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": "610c348b892f15a2c15140528863aee389801a78"
112
+ "gitHead": "e905549de3c3dc04a1da47b7bf167b65b0e9413b"
113
113
  }