@odx/addon-ag-grid 1.2.2 → 1.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.
package/README.md CHANGED
@@ -88,7 +88,3 @@ const odxTheme = themeOdx
88
88
  ### Documentation
89
89
 
90
90
  For advanced usage, customization strategies, and best practices, refer to our <a href="https://odx.draeger.com" target="_blank" rel="noopener">documentation</a>.
91
-
92
- ### Contact
93
-
94
- For questions, feedback, or support, please reach out via our <a href="https://odx.draeger.com/contact" target="_blank" rel="noopener">contact page</a>.
@@ -16,4 +16,3 @@ export declare const buttonStyleOdx: import('ag-grid-community').Part<{
16
16
  buttonDisabledBackgroundColor: import('ag-grid-community').ColorValue;
17
17
  buttonDisabledBorder: import('ag-grid-community').BorderValue;
18
18
  }>;
19
- //# sourceMappingURL=button-style.d.ts.map
@@ -0,0 +1,29 @@
1
+ import { token } from '@odx/design-tokens';
2
+ import { createPart } from 'ag-grid-community';
3
+
4
+ const styles = ".ag-button{transition:var(--odx-motion-transition-reduced);cursor:pointer;text-indent:inherit;text-transform:inherit;text-shadow:inherit;line-height:inherit;word-spacing:inherit;letter-spacing:inherit;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;background:0 0;border:none;margin:0;padding:0;transition-property:background-color,border-color,color;&:disabled{cursor:default}&:focus-visible{outline:var(--odx-focus-ring-outer);box-shadow:var(--odx-focus-ring-inner)}}.ag-standard-button{appearance:none;border:var(--ag-button-border);border-radius:var(--ag-button-border-radius);background-color:var(--ag-button-background-color);cursor:pointer;padding:var(--ag-button-vertical-padding) var(--ag-button-horizontal-padding);color:var(--ag-button-text-color);font-weight:var(--ag-button-font-weight);&:hover{border:var(--ag-button-hover-border);background-color:var(--ag-button-hover-background-color);color:var(--ag-button-hover-text-color)}&:active{border:var(--ag-button-active-border);background-color:var(--ag-button-active-background-color);color:var(--ag-button-active-text-color)}&:disabled{border:var(--ag-button-disabled-border);background-color:var(--ag-button-disabled-background-color);color:var(--ag-button-disabled-text-color)}}";
5
+
6
+ const buttonStyleOdx = createPart({
7
+ feature: "buttonStyle",
8
+ params: {
9
+ buttonActiveBackgroundColor: token("color.background.primary.pressed"),
10
+ buttonActiveBorder: false,
11
+ buttonActiveTextColor: token("color.foreground.inverse"),
12
+ buttonBackgroundColor: token("color.background.primary.rest"),
13
+ buttonBorder: false,
14
+ buttonBorderRadius: token("border-radius.control"),
15
+ buttonDisabledBackgroundColor: token("color.background.disabled.rest"),
16
+ buttonDisabledBorder: false,
17
+ buttonDisabledTextColor: token("color.foreground.disabled.rest"),
18
+ buttonFontWeight: token("typography.font-weight.medium"),
19
+ buttonHorizontalPadding: { calc: `${token("control.spacing-inline-md")} * 2` },
20
+ buttonHoverBackgroundColor: token("color.background.primary.hover"),
21
+ buttonHoverBorder: false,
22
+ buttonHoverTextColor: token("color.foreground.inverse"),
23
+ buttonTextColor: token("color.foreground.inverse"),
24
+ buttonVerticalPadding: token("control.spacing-md")
25
+ },
26
+ css: styles
27
+ });
28
+
29
+ export { buttonStyleOdx };
@@ -13,4 +13,3 @@ export declare const checkboxStyleOdx: import('ag-grid-community').Part<{
13
13
  checkboxUncheckedBorderColor: import('ag-grid-community').ColorValue;
14
14
  radioCheckedShapeImage: import('ag-grid-community').ImageValue;
15
15
  }>;
16
- //# sourceMappingURL=checkbox-style.d.ts.map
@@ -0,0 +1,34 @@
1
+ import { token } from '@odx/design-tokens';
2
+ import { MinusIcon, CheckIcon } from '@odx/icons/core';
3
+ import { createPart } from 'ag-grid-community';
4
+ import { getIconContent } from './icon-set.js';
5
+
6
+ const styles = ".ag-checkbox-input-wrapper,.ag-radio-button-input-wrapper{transition:var(--odx-motion-transition-reduced);border:solid var(--ag-checkbox-border-width) var(--ag-checkbox-unchecked-border-color);background-color:var(--ag-checkbox-unchecked-background-color);width:var(--ag-icon-size);height:var(--ag-icon-size);flex:none;transition-property:background-color,border-color;position:relative;&:after{content:\"\";pointer-events:none;display:block;position:absolute;inset:0;mask-position:50%;mask-repeat:no-repeat}&:where(:focus-within){outline:var(--odx-focus-ring-outer);outline-offset:var(--odx-focus-ring-offset-sm)}&.ag-checked{border-color:var(--ag-checkbox-checked-border-color);background-color:var(--ag-checkbox-checked-background-color);&:after{background-color:var(--ag-checkbox-checked-shape-color)}}&.ag-disabled{filter:grayscale();opacity:.5}& input{appearance:none;opacity:0;cursor:pointer;width:var(--ag-icon-size);height:var(--ag-icon-size);margin:0;display:block}}.ag-checkbox-input-wrapper{border-radius:var(--ag-checkbox-border-radius);&.ag-checked:after{mask-image:var(--ag-checkbox-checked-shape-image)}&.ag-indeterminate{border-color:var(--ag-checkbox-indeterminate-border-color);background-color:var(--ag-checkbox-indeterminate-background-color);&:after{background-color:var(--ag-checkbox-indeterminate-shape-color);mask-image:var(--ag-checkbox-indeterminate-shape-image)}}}.ag-cell-editing-error .ag-checkbox-input-wrapper:focus-within{outline:var(--odx-border-width-thick) solid var(--odx-color-stroke-danger-rest);outline-offset:var(--odx-focus-ring-offset-sm)}.ag-radio-button-input-wrapper{border-radius:100%;&.ag-checked:after{mask-image:var(--ag-radio-checked-shape-image)}}";
7
+
8
+ const checkboxStyleOdx = createPart({
9
+ feature: "checkboxStyle",
10
+ params: {
11
+ checkboxBorderRadius: token("border-radius.control"),
12
+ checkboxBorderWidth: token("border-width.thin"),
13
+ checkboxUncheckedBackgroundColor: token("color.background.control.rest"),
14
+ checkboxUncheckedBorderColor: token("color.stroke.control.rest"),
15
+ checkboxCheckedBackgroundColor: token("color.background.control.selected"),
16
+ checkboxCheckedBorderColor: token("color.stroke.control.selected"),
17
+ checkboxCheckedShapeColor: token("color.foreground.inverse-static"),
18
+ checkboxCheckedShapeImage: {
19
+ svg: getIconContent(CheckIcon).svg
20
+ },
21
+ checkboxIndeterminateBackgroundColor: token("color.background.control.selected"),
22
+ checkboxIndeterminateBorderColor: token("color.stroke.control.selected"),
23
+ checkboxIndeterminateShapeColor: token("color.foreground.inverse-static"),
24
+ checkboxIndeterminateShapeImage: {
25
+ svg: getIconContent(MinusIcon).svg
26
+ },
27
+ radioCheckedShapeImage: {
28
+ svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><circle cx="12" cy="12" r="4" /></svg>`
29
+ }
30
+ },
31
+ css: styles
32
+ });
33
+
34
+ export { checkboxStyleOdx };
@@ -1,3 +1,2 @@
1
1
  import { Part } from 'ag-grid-community';
2
2
  export declare const coreStylesOdx: Part;
3
- //# sourceMappingURL=core-style.d.ts.map
@@ -0,0 +1,10 @@
1
+ import { createPart } from 'ag-grid-community';
2
+
3
+ const styles = ".ag-header-cell,.ag-picker-field-wrapper,.ag-select-list-item,.ag-select-list-item:after{transition:var(--odx-motion-transition-reduced);transition-property:background-color}.ag-filter-apply-panel-button{line-height:1.5em}.ag-picker-field-wrapper{--ag-focus-shadow:var(--odx-focus-ring-inner);border-bottom:var(--odx-border-width-thin) solid var(--odx-color-stroke-control-rest);border-radius:var(--odx-border-radius-control);background-color:var(--odx-color-background-control-rest);cursor:pointer;min-width:var(--odx-control-width-lg);&:focus-within{outline:var(--odx-focus-ring-outer)}}.ag-select-list{border-radius:var(--odx-border-radius-control);box-shadow:var(--odx-elevation-shadow-level-1);background-color:var(--odx-color-background-level-2);.ag-select-list-item{border:var(--odx-border-width-thin) solid transparent;cursor:pointer;padding-inline:calc(var(--odx-control-spacing-inline-md) - var(--odx-border-width-thin));height:var(--odx-control-height-md);touch-action:manipulation;display:flex;&.ag-active-item{background-color:var(--odx-color-background-transparent-selected-hover)}}}.ag-header-cell-text{flex:1}.ag-paging-panel .ag-paging-row-summary-panel-number{font-weight:var(--odx-typography-font-weight-semibold)}.ag-cell-focus:not(.ag-cell-range-selected):focus-within,.ag-cell-focus:not(.ag-cell-range-selected).pseudo-focus-within,.pseudo-focus-within-all .ag-cell-focus:not(.ag-cell-range-selected),.ag-cell-range-single-cell,.ag-cell-range-single-cell.ag-cell-range-handle,.ag-context-menu-open .ag-cell-focus:not(.ag-cell-range-selected),.ag-context-menu-open .ag-full-width-row.ag-row-focus .ag-cell-wrapper.ag-row-group,.ag-full-width-row.ag-row-focus:focus .ag-cell-wrapper.ag-row-group,.ag-full-width-row.ag-row-focus.pseudo-focus .ag-cell-wrapper.ag-row-group,.pseudo-focus-all .ag-full-width-row.ag-row-focus .ag-cell-wrapper.ag-row-group{border-width:var(--odx-border-width-thick)}";
4
+
5
+ const coreStylesOdx = createPart({
6
+ feature: "coreStyles",
7
+ css: styles
8
+ });
9
+
10
+ export { coreStylesOdx };
@@ -3,4 +3,3 @@ export declare function getIconContent(icon: typeof AggregationIcon): {
3
3
  svg: string;
4
4
  };
5
5
  export declare const iconSetOdx: import('ag-grid-community').Part<{}>;
6
- //# sourceMappingURL=icon-set.d.ts.map
@@ -0,0 +1,73 @@
1
+ import { ArrowUpIcon, LinkOffIcon, ChevronDownIcon, MinusIcon, ChevronRightIcon, CheckIcon, ChevronUpIcon, ChevronLeftIcon, SaveIcon, ArrowRightIcon, PlusIcon, TableIcon, PinIcon, PasteIcon, ErrorIcon, SortableIcon, MinimizeIcon, MoreIcon, MenuIcon, MaximizeIcon, LoadingIcon, LinkIcon, ArrowLeftIcon, ChevronRightEndIcon, GroupIcon, RearrangeIcon, ChevronLeftEndIcon, FilterIcon, ViewIcon, ViewOffIcon, FileExcelIcon, EditIcon, ArrowDownIcon, DescendingIcon, FileCsvIcon, CloseIcon, CutIcon, CopyContentIcon, ColumnIcon, ColorpickerIcon, BarChartIcon, CancelIcon, AscendingIcon, ChevronsIcon, AggregationIcon } from '@odx/icons/core';
2
+ import { iconOverrides } from 'ag-grid-community';
3
+
4
+ function getIconContent(icon) {
5
+ return { svg: icon.content || "" };
6
+ }
7
+ const iconSetOdx = iconOverrides({
8
+ type: "image",
9
+ mask: true,
10
+ icons: {
11
+ aggregation: getIconContent(AggregationIcon),
12
+ arrows: getIconContent(ChevronsIcon),
13
+ asc: getIconContent(AscendingIcon),
14
+ cancel: getIconContent(CancelIcon),
15
+ chart: getIconContent(BarChartIcon),
16
+ "chevron-up": getIconContent(ChevronUpIcon),
17
+ "chevron-down": getIconContent(ChevronDownIcon),
18
+ "chevron-left": getIconContent(ChevronLeftIcon),
19
+ "chevron-right": getIconContent(ChevronRightIcon),
20
+ "color-picker": getIconContent(ColorpickerIcon),
21
+ columns: getIconContent(ColumnIcon),
22
+ contracted: getIconContent(ChevronRightIcon),
23
+ copy: getIconContent(CopyContentIcon),
24
+ cut: getIconContent(CutIcon),
25
+ cross: getIconContent(CloseIcon),
26
+ csv: getIconContent(FileCsvIcon),
27
+ desc: getIconContent(DescendingIcon),
28
+ down: getIconContent(ArrowDownIcon),
29
+ edit: getIconContent(EditIcon),
30
+ excel: getIconContent(FileExcelIcon),
31
+ expanded: getIconContent(ChevronLeftIcon),
32
+ "eye-slash": getIconContent(ViewOffIcon),
33
+ eye: getIconContent(ViewIcon),
34
+ filter: getIconContent(FilterIcon),
35
+ // 'filter-add': '',
36
+ first: getIconContent(ChevronLeftEndIcon),
37
+ grip: getIconContent(RearrangeIcon),
38
+ group: getIconContent(GroupIcon),
39
+ last: getIconContent(ChevronRightEndIcon),
40
+ left: getIconContent(ArrowLeftIcon),
41
+ linked: getIconContent(LinkIcon),
42
+ loading: getIconContent(LoadingIcon),
43
+ maximize: getIconContent(MaximizeIcon),
44
+ menu: getIconContent(MenuIcon),
45
+ "menu-alt": getIconContent(MoreIcon),
46
+ minimize: getIconContent(MinimizeIcon),
47
+ minus: getIconContent(MinusIcon),
48
+ next: getIconContent(ChevronRightIcon),
49
+ none: getIconContent(SortableIcon),
50
+ "not-allowed": getIconContent(ErrorIcon),
51
+ paste: getIconContent(PasteIcon),
52
+ pin: getIconContent(PinIcon),
53
+ // 'pinned-bottom': '',
54
+ // 'pinned-top': '',
55
+ pivot: getIconContent(TableIcon),
56
+ plus: getIconContent(PlusIcon),
57
+ previous: getIconContent(ChevronLeftIcon),
58
+ right: getIconContent(ArrowRightIcon),
59
+ save: getIconContent(SaveIcon),
60
+ "small-down": getIconContent(ChevronDownIcon),
61
+ "small-left": getIconContent(ChevronLeftIcon),
62
+ "small-right": getIconContent(ChevronRightIcon),
63
+ "small-up": getIconContent(ChevronUpIcon),
64
+ tick: getIconContent(CheckIcon),
65
+ "tree-closed": getIconContent(ChevronRightIcon),
66
+ "tree-indeterminate": getIconContent(MinusIcon),
67
+ "tree-open": getIconContent(ChevronDownIcon),
68
+ unlinked: getIconContent(LinkOffIcon),
69
+ up: getIconContent(ArrowUpIcon)
70
+ }
71
+ });
72
+
73
+ export { getIconContent, iconSetOdx };
@@ -1,3 +1,2 @@
1
1
  import { Part } from 'ag-grid-community';
2
2
  export declare const inputStyleOdx: Part;
3
- //# sourceMappingURL=input-style.d.ts.map
@@ -0,0 +1,10 @@
1
+ import { createPart } from 'ag-grid-community';
2
+
3
+ const styles = ".ag-input-field-input[type=number]:not(.ag-number-field-input-stepper){appearance:textfield;&::-webkit-inner-spin-button{appearance:none;margin:0}&::-webkit-outer-spin-button{appearance:none;margin:0}}.ag-input-field-input:is(input:not([type]),input[type=text],input[type=number],input[type=tel],input[type=date],input[type=datetime-local],textarea){--_color-background:var(--odx-color-background-control-rest);--_color-background-hover:var(--odx-color-background-control-hover);--_color-stroke:var(--odx-color-stroke-control-rest);--_color-stroke-hover:var(--odx-color-stroke-control-hover);border-bottom:var(--odx-border-width-thin) solid var(--odx-color-stroke-control-rest);border-radius:var(--odx-border-radius-control);background-color:var(--_color-background);padding-block:calc(var(--odx-control-spacing-md) - var(--odx-border-width-thin));padding-inline:calc(var(--odx-control-spacing-inline-md) - var(--odx-border-width-thin));min-width:var(--odx-control-width-lg);min-height:var(--odx-control-height-md);line-height:inherit;color:inherit;font-family:inherit;font-size:inherit;margin:0;&::placeholder{color:var(--odx-color-foreground-subtle);font-weight:var(--odx-typography-font-weight-normal)}&:disabled{--_color-foreground:var(--odx-color-foreground-disabled-rest);--_color-background:var(--odx-color-background-disabled-rest);--_color-stroke:var(--odx-color-stroke-disabled-rest)}&:focus{outline:var(--odx-focus-ring-outer);box-shadow:var(--odx-focus-ring-inner)}&:invalid,&.invalid{--_color-background:var(--odx-color-background-danger-subtle);--_color-stroke:var(--odx-color-foreground-danger-rest)}}";
4
+
5
+ const inputStyleOdx = createPart({
6
+ feature: "inputStyle",
7
+ css: styles
8
+ });
9
+
10
+ export { inputStyleOdx };
@@ -19,4 +19,3 @@ export declare const tabStyleOdx: import('ag-grid-community').Part<{
19
19
  tabTextColor: import('ag-grid-community').ColorValue;
20
20
  tabTopPadding: import('ag-grid-community').LengthValue;
21
21
  }>;
22
- //# sourceMappingURL=tab-style.d.ts.map
@@ -0,0 +1,49 @@
1
+ import { createPart } from 'ag-grid-community';
2
+
3
+ const styles = ".ag-tabs-header{gap:var(--ag-tab-spacing);border-bottom:var(--ag-tab-bar-border);background-color:var(--ag-tab-bar-background-color);padding:var(--ag-tab-bar-top-padding) var(--ag-tab-bar-horizontal-padding) 0;flex:1;display:flex}.ag-tabs-header-wrapper{display:flex}.ag-tabs-close-button-wrapper{padding:var(--ag-spacing);border:0;align-items:center;display:flex}.ag-ltr .ag-tabs-close-button-wrapper{border-right:solid var(--ag-border-width) var(--ag-border-color)}.ag-rtl .ag-tabs-close-button-wrapper{border-left:solid var(--ag-border-width) var(--ag-border-color)}.ag-tabs-close-button{background-color:unset;cursor:pointer;border:0;padding:0}.ag-tab{border-right:var(--ag-tab-selected-border-width) solid transparent;border-left:var(--ag-tab-selected-border-width) solid transparent;background-color:var(--ag-tab-background-color);cursor:pointer;padding:var(--ag-tab-top-padding) var(--ag-tab-horizontal-padding) var(--ag-tab-bottom-padding);color:var(--ag-tab-text-color);flex:1;justify-content:center;align-items:center;display:flex;position:relative;&:after{transition:opacity var(--ag-tab-selected-underline-transition-duration);opacity:0;background-color:var(--ag-tab-selected-underline-color);height:var(--ag-tab-selected-underline-width);content:\"\";display:block;position:absolute;bottom:0;left:0;right:0}&:hover{background-color:var(--ag-tab-hover-background-color);color:var(--ag-tab-hover-text-color)}&.ag-tab-selected{background-color:var(--ag-tab-selected-background-color);color:var(--ag-tab-selected-text-color)}&.ag-tab-selected:after{opacity:1}}.ag-ltr .ag-tab{&.ag-tab-selected{&:not(:first-of-type){border-left-color:var(--ag-tab-selected-border-color)}&:not(:last-of-type){border-right-color:var(--ag-tab-selected-border-color)}}}.ag-rtl .ag-tab{&.ag-tab-selected{&:not(:first-of-type){border-right-color:var(--ag-tab-selected-border-color)}&:not(:last-of-type){border-left-color:var(--ag-tab-selected-border-color)}}}";
4
+
5
+ const tabStyleOdx = createPart({
6
+ feature: "tabStyle",
7
+ params: {
8
+ tabBarBackgroundColor: "transparent",
9
+ tabBarHorizontalPadding: 0,
10
+ tabBarTopPadding: 0,
11
+ tabBackgroundColor: "transparent",
12
+ tabTextColor: {
13
+ ref: "textColor"
14
+ },
15
+ tabHorizontalPadding: {
16
+ ref: "spacing"
17
+ },
18
+ tabTopPadding: {
19
+ ref: "spacing"
20
+ },
21
+ tabBottomPadding: {
22
+ ref: "spacing"
23
+ },
24
+ tabSpacing: "0",
25
+ tabHoverBackgroundColor: {
26
+ ref: "tabBackgroundColor"
27
+ },
28
+ tabHoverTextColor: {
29
+ ref: "tabTextColor"
30
+ },
31
+ tabSelectedBackgroundColor: {
32
+ ref: "tabBackgroundColor"
33
+ },
34
+ tabSelectedTextColor: {
35
+ ref: "tabTextColor"
36
+ },
37
+ tabSelectedBorderWidth: {
38
+ ref: "borderWidth"
39
+ },
40
+ tabSelectedBorderColor: "transparent",
41
+ tabSelectedUnderlineColor: "transparent",
42
+ tabSelectedUnderlineWidth: 0,
43
+ tabSelectedUnderlineTransitionDuration: 0,
44
+ tabBarBorder: false
45
+ },
46
+ css: styles
47
+ });
48
+
49
+ export { tabStyleOdx };
@@ -1,3 +1,2 @@
1
1
  import { Theme, ThemeDefaultParams } from 'ag-grid-community';
2
2
  export declare const themeOdx: Theme<ThemeDefaultParams>;
3
- //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1,70 @@
1
+ import { token } from '@odx/design-tokens';
2
+ import { createTheme } from 'ag-grid-community';
3
+ import { coreStylesOdx } from './parts/core-style.js';
4
+ import { iconSetOdx } from './parts/icon-set.js';
5
+
6
+ const themeOdx = createTheme().withPart(iconSetOdx).withParams({
7
+ accentColor: token("color.foreground.rest"),
8
+ wrapperBorder: false,
9
+ wrapperBorderRadius: token("border-radius.md"),
10
+ borderRadius: token("border-radius.md"),
11
+ foregroundColor: token("color.foreground.rest"),
12
+ borderColor: token("color.stroke.neutral.subtle"),
13
+ backgroundColor: token("color.background.level-1"),
14
+ headerBackgroundColor: "transparent",
15
+ headerColumnResizeHandleColor: token("color.stroke.control.rest"),
16
+ headerRowBorder: {
17
+ style: "solid",
18
+ color: token("color.stroke.control.rest"),
19
+ width: token("border-width.thin")
20
+ },
21
+ fontFamily: token("typography.font-family.base"),
22
+ fontSize: token("typography.font-size.base"),
23
+ headerFontWeight: token("typography.font-weight.semibold"),
24
+ rowBorder: {
25
+ style: "solid",
26
+ color: token("color.stroke.neutral.subtle"),
27
+ width: token("border-width.thin")
28
+ },
29
+ rowHeight: token("size.300"),
30
+ rowHoverColor: token("color.background.transparent.hover"),
31
+ oddRowBackgroundColor: token("color.background.transparent.hover"),
32
+ selectedRowBackgroundColor: token("color.background.transparent.selected"),
33
+ cellHorizontalPadding: token("spacing.75"),
34
+ pinnedColumnBorder: {
35
+ width: token("border-width.thin"),
36
+ style: "solid",
37
+ color: token("color.stroke.control.rest")
38
+ },
39
+ rangeSelectionBorderColor: token("color.stroke.focus.outer"),
40
+ iconSize: token("control.addon-size-sm"),
41
+ iconButtonActiveColor: token("color.foreground.rest"),
42
+ iconButtonActiveBackgroundColor: token("color.background.transparent.hover"),
43
+ iconButtonColor: token("color.foreground.rest"),
44
+ iconButtonBackgroundColor: "transparent",
45
+ iconButtonActiveIndicatorColor: token("color.foreground.rest"),
46
+ iconButtonHoverBackgroundColor: token("color.background.transparent.hover"),
47
+ iconColor: token("color.foreground.rest"),
48
+ invalidColor: token("color.background.warning.rest"),
49
+ browserColorScheme: "inherit",
50
+ menuBackgroundColor: token("color.background.level-2"),
51
+ menuBorder: "none",
52
+ menuShadow: token("elevation.shadow.level-2"),
53
+ menuTextColor: token("color.foreground.rest"),
54
+ widgetVerticalSpacing: token("spacing.100"),
55
+ footerRowBorder: {
56
+ style: "solid",
57
+ color: token("color.stroke.control.rest"),
58
+ width: token("border-width.thin")
59
+ },
60
+ focusShadow: {
61
+ color: token("color.stroke.focus.outer"),
62
+ offsetX: 0,
63
+ offsetY: 0,
64
+ spread: {
65
+ calc: "var(--odx-focus-ring-offset) * -1"
66
+ }
67
+ }
68
+ }).withPart(coreStylesOdx);
69
+
70
+ export { themeOdx };
package/dist/main.d.ts CHANGED
@@ -4,4 +4,3 @@ export * from './lib/parts/icon-set.js';
4
4
  export * from './lib/parts/input-style.js';
5
5
  export * from './lib/parts/tab-style.js';
6
6
  export * from './lib/theme.js';
7
- //# sourceMappingURL=main.d.ts.map
package/dist/main.js CHANGED
@@ -1,251 +1,6 @@
1
- import { token } from '@odx/design-tokens';
2
- import { createPart, iconOverrides, createTheme } from 'ag-grid-community';
3
- import { ArrowUpIcon, LinkOffIcon, ChevronDownIcon, MinusIcon, ChevronRightIcon, CheckIcon, ChevronUpIcon, ChevronLeftIcon, SaveIcon, ArrowRightIcon, PlusIcon, TableIcon, PinIcon, PasteIcon, ErrorIcon, SortableIcon, MinimizeIcon, MoreIcon, MenuIcon, MaximizeIcon, LoadingIcon, LinkIcon, ArrowLeftIcon, ChevronRightEndIcon, GroupIcon, RearrangeIcon, ChevronLeftEndIcon, FilterIcon, ViewIcon, ViewOffIcon, FileExcelIcon, EditIcon, ArrowDownIcon, DescendingIcon, FileCsvIcon, CloseIcon, CutIcon, CopyContentIcon, ColumnIcon, ColorpickerIcon, BarChartIcon, CancelIcon, AscendingIcon, ChevronsIcon, AggregationIcon } from '@odx/icons/core';
4
-
5
- const styles$4 = ".ag-button{transition:var(--odx-motion-transition-reduced);cursor:pointer;text-indent:inherit;text-transform:inherit;text-shadow:inherit;line-height:inherit;word-spacing:inherit;letter-spacing:inherit;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;background:0 0;border:none;margin:0;padding:0;transition-property:background-color,border-color,color;&:disabled{cursor:default}&:focus-visible{outline:var(--odx-focus-ring-outer);box-shadow:var(--odx-focus-ring-inner)}}.ag-standard-button{appearance:none;border:var(--ag-button-border);border-radius:var(--ag-button-border-radius);background-color:var(--ag-button-background-color);cursor:pointer;padding:var(--ag-button-vertical-padding)var(--ag-button-horizontal-padding);color:var(--ag-button-text-color);font-weight:var(--ag-button-font-weight);&:hover{border:var(--ag-button-hover-border);background-color:var(--ag-button-hover-background-color);color:var(--ag-button-hover-text-color)}&:active{border:var(--ag-button-active-border);background-color:var(--ag-button-active-background-color);color:var(--ag-button-active-text-color)}&:disabled{border:var(--ag-button-disabled-border);background-color:var(--ag-button-disabled-background-color);color:var(--ag-button-disabled-text-color)}}";
6
-
7
- const buttonStyleOdx = createPart({
8
- feature: "buttonStyle",
9
- params: {
10
- buttonActiveBackgroundColor: token("color.background.primary.pressed"),
11
- buttonActiveBorder: false,
12
- buttonActiveTextColor: token("color.foreground.inverse"),
13
- buttonBackgroundColor: token("color.background.primary.rest"),
14
- buttonBorder: false,
15
- buttonBorderRadius: token("border-radius.control"),
16
- buttonDisabledBackgroundColor: token("color.background.disabled.rest"),
17
- buttonDisabledBorder: false,
18
- buttonDisabledTextColor: token("color.foreground.disabled.rest"),
19
- buttonFontWeight: token("typography.font-weight.medium"),
20
- buttonHorizontalPadding: { calc: `${token("control.spacing-inline-md")} * 2` },
21
- buttonHoverBackgroundColor: token("color.background.primary.hover"),
22
- buttonHoverBorder: false,
23
- buttonHoverTextColor: token("color.foreground.inverse"),
24
- buttonTextColor: token("color.foreground.inverse"),
25
- buttonVerticalPadding: token("control.spacing-md")
26
- },
27
- css: styles$4
28
- });
29
-
30
- const styles$3 = ".ag-checkbox-input-wrapper,.ag-radio-button-input-wrapper{transition:var(--odx-motion-transition-reduced);border:solid var(--ag-checkbox-border-width)var(--ag-checkbox-unchecked-border-color);background-color:var(--ag-checkbox-unchecked-background-color);width:var(--ag-icon-size);height:var(--ag-icon-size);flex:none;transition-property:background-color,border-color;position:relative;&:after{content:\"\";pointer-events:none;display:block;position:absolute;inset:0;mask-position:50%;mask-repeat:no-repeat}&:where(:focus-within){outline:var(--odx-focus-ring-outer);outline-offset:var(--odx-focus-ring-offset-sm)}&.ag-checked{border-color:var(--ag-checkbox-checked-border-color);background-color:var(--ag-checkbox-checked-background-color);&:after{background-color:var(--ag-checkbox-checked-shape-color)}}&.ag-disabled{filter:grayscale();opacity:.5}& input{appearance:none;opacity:0;cursor:pointer;width:var(--ag-icon-size);height:var(--ag-icon-size);margin:0;display:block}}.ag-checkbox-input-wrapper{border-radius:var(--ag-checkbox-border-radius);&.ag-checked:after{mask-image:var(--ag-checkbox-checked-shape-image)}&.ag-indeterminate{border-color:var(--ag-checkbox-indeterminate-border-color);background-color:var(--ag-checkbox-indeterminate-background-color);&:after{background-color:var(--ag-checkbox-indeterminate-shape-color);mask-image:var(--ag-checkbox-indeterminate-shape-image)}}}.ag-cell-editing-error .ag-checkbox-input-wrapper:focus-within{outline:var(--odx-border-width-thick)solid var(--odx-color-stroke-danger-rest);outline-offset:var(--odx-focus-ring-offset-sm)}.ag-radio-button-input-wrapper{border-radius:100%;&.ag-checked:after{mask-image:var(--ag-radio-checked-shape-image)}}";
31
-
32
- function getIconContent(icon) {
33
- return { svg: icon.content || "" };
34
- }
35
- const iconSetOdx = iconOverrides({
36
- type: "image",
37
- mask: true,
38
- icons: {
39
- aggregation: getIconContent(AggregationIcon),
40
- arrows: getIconContent(ChevronsIcon),
41
- asc: getIconContent(AscendingIcon),
42
- cancel: getIconContent(CancelIcon),
43
- chart: getIconContent(BarChartIcon),
44
- "chevron-up": getIconContent(ChevronUpIcon),
45
- "chevron-down": getIconContent(ChevronDownIcon),
46
- "chevron-left": getIconContent(ChevronLeftIcon),
47
- "chevron-right": getIconContent(ChevronRightIcon),
48
- "color-picker": getIconContent(ColorpickerIcon),
49
- columns: getIconContent(ColumnIcon),
50
- contracted: getIconContent(ChevronRightIcon),
51
- copy: getIconContent(CopyContentIcon),
52
- cut: getIconContent(CutIcon),
53
- cross: getIconContent(CloseIcon),
54
- csv: getIconContent(FileCsvIcon),
55
- desc: getIconContent(DescendingIcon),
56
- down: getIconContent(ArrowDownIcon),
57
- edit: getIconContent(EditIcon),
58
- excel: getIconContent(FileExcelIcon),
59
- expanded: getIconContent(ChevronLeftIcon),
60
- "eye-slash": getIconContent(ViewOffIcon),
61
- eye: getIconContent(ViewIcon),
62
- filter: getIconContent(FilterIcon),
63
- // 'filter-add': '',
64
- first: getIconContent(ChevronLeftEndIcon),
65
- grip: getIconContent(RearrangeIcon),
66
- group: getIconContent(GroupIcon),
67
- last: getIconContent(ChevronRightEndIcon),
68
- left: getIconContent(ArrowLeftIcon),
69
- linked: getIconContent(LinkIcon),
70
- loading: getIconContent(LoadingIcon),
71
- maximize: getIconContent(MaximizeIcon),
72
- menu: getIconContent(MenuIcon),
73
- "menu-alt": getIconContent(MoreIcon),
74
- minimize: getIconContent(MinimizeIcon),
75
- minus: getIconContent(MinusIcon),
76
- next: getIconContent(ChevronRightIcon),
77
- none: getIconContent(SortableIcon),
78
- "not-allowed": getIconContent(ErrorIcon),
79
- paste: getIconContent(PasteIcon),
80
- pin: getIconContent(PinIcon),
81
- // 'pinned-bottom': '',
82
- // 'pinned-top': '',
83
- pivot: getIconContent(TableIcon),
84
- plus: getIconContent(PlusIcon),
85
- previous: getIconContent(ChevronLeftIcon),
86
- right: getIconContent(ArrowRightIcon),
87
- save: getIconContent(SaveIcon),
88
- "small-down": getIconContent(ChevronDownIcon),
89
- "small-left": getIconContent(ChevronLeftIcon),
90
- "small-right": getIconContent(ChevronRightIcon),
91
- "small-up": getIconContent(ChevronUpIcon),
92
- tick: getIconContent(CheckIcon),
93
- "tree-closed": getIconContent(ChevronRightIcon),
94
- "tree-indeterminate": getIconContent(MinusIcon),
95
- "tree-open": getIconContent(ChevronDownIcon),
96
- unlinked: getIconContent(LinkOffIcon),
97
- up: getIconContent(ArrowUpIcon)
98
- }
99
- });
100
-
101
- const checkboxStyleOdx = createPart({
102
- feature: "checkboxStyle",
103
- params: {
104
- checkboxBorderRadius: token("border-radius.control"),
105
- checkboxBorderWidth: token("border-width.thin"),
106
- checkboxUncheckedBackgroundColor: token("color.background.control.rest"),
107
- checkboxUncheckedBorderColor: token("color.stroke.control.rest"),
108
- checkboxCheckedBackgroundColor: token("color.background.control.selected"),
109
- checkboxCheckedBorderColor: token("color.stroke.control.selected"),
110
- checkboxCheckedShapeColor: token("color.foreground.inverse-static"),
111
- checkboxCheckedShapeImage: {
112
- svg: getIconContent(CheckIcon).svg
113
- },
114
- checkboxIndeterminateBackgroundColor: token("color.background.control.selected"),
115
- checkboxIndeterminateBorderColor: token("color.stroke.control.selected"),
116
- checkboxIndeterminateShapeColor: token("color.foreground.inverse-static"),
117
- checkboxIndeterminateShapeImage: {
118
- svg: getIconContent(MinusIcon).svg
119
- },
120
- radioCheckedShapeImage: {
121
- svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><circle cx="12" cy="12" r="4" /></svg>`
122
- }
123
- },
124
- css: styles$3
125
- });
126
-
127
- const styles$2 = ".ag-input-field-input[type=number]:not(.ag-number-field-input-stepper){appearance:textfield;&::-webkit-inner-spin-button{appearance:none;margin:0}&::-webkit-outer-spin-button{appearance:none;margin:0}}.ag-input-field-input:is(input:not([type]),input[type=text],input[type=number],input[type=tel],input[type=date],input[type=datetime-local],textarea){--_color-background:var(--odx-color-background-control-rest);--_color-background-hover:var(--odx-color-background-control-hover);--_color-stroke:var(--odx-color-stroke-control-rest);--_color-stroke-hover:var(--odx-color-stroke-control-hover);border-bottom:var(--odx-border-width-thin)solid var(--odx-color-stroke-control-rest);border-radius:var(--odx-border-radius-control);background-color:var(--_color-background);padding-block:calc(var(--odx-control-spacing-md) - var(--odx-border-width-thin));padding-inline:calc(var(--odx-control-spacing-inline-md) - var(--odx-border-width-thin));min-width:var(--odx-control-width-lg);min-height:var(--odx-control-height-md);line-height:inherit;color:inherit;font-family:inherit;font-size:inherit;margin:0;&::placeholder{color:var(--odx-color-foreground-subtle);font-weight:var(--odx-typography-font-weight-normal)}&:disabled{--_color-foreground:var(--odx-color-foreground-disabled-rest);--_color-background:var(--odx-color-background-disabled-rest);--_color-stroke:var(--odx-color-stroke-disabled-rest)}&:focus{outline:var(--odx-focus-ring-outer);box-shadow:var(--odx-focus-ring-inner)}&:invalid,&.invalid{--_color-background:var(--odx-color-background-danger-subtle);--_color-stroke:var(--odx-color-foreground-danger-rest)}}";
128
-
129
- const inputStyleOdx = createPart({
130
- feature: "inputStyle",
131
- css: styles$2
132
- });
133
-
134
- const styles$1 = ".ag-tabs-header{gap:var(--ag-tab-spacing);border-bottom:var(--ag-tab-bar-border);background-color:var(--ag-tab-bar-background-color);padding:var(--ag-tab-bar-top-padding)var(--ag-tab-bar-horizontal-padding)0;flex:1;display:flex}.ag-tabs-header-wrapper{display:flex}.ag-tabs-close-button-wrapper{padding:var(--ag-spacing);border:0;align-items:center;display:flex}.ag-ltr .ag-tabs-close-button-wrapper{border-right:solid var(--ag-border-width)var(--ag-border-color)}.ag-rtl .ag-tabs-close-button-wrapper{border-left:solid var(--ag-border-width)var(--ag-border-color)}.ag-tabs-close-button{background-color:unset;cursor:pointer;border:0;padding:0}.ag-tab{border-right:var(--ag-tab-selected-border-width)solid transparent;border-left:var(--ag-tab-selected-border-width)solid transparent;background-color:var(--ag-tab-background-color);cursor:pointer;padding:var(--ag-tab-top-padding)var(--ag-tab-horizontal-padding)var(--ag-tab-bottom-padding);color:var(--ag-tab-text-color);flex:1;justify-content:center;align-items:center;display:flex;position:relative;&:after{transition:opacity var(--ag-tab-selected-underline-transition-duration);opacity:0;background-color:var(--ag-tab-selected-underline-color);height:var(--ag-tab-selected-underline-width);content:\"\";display:block;position:absolute;bottom:0;left:0;right:0}&:hover{background-color:var(--ag-tab-hover-background-color);color:var(--ag-tab-hover-text-color)}&.ag-tab-selected{background-color:var(--ag-tab-selected-background-color);color:var(--ag-tab-selected-text-color)}&.ag-tab-selected:after{opacity:1}}.ag-ltr .ag-tab{&.ag-tab-selected{&:not(:first-of-type){border-left-color:var(--ag-tab-selected-border-color)}&:not(:last-of-type){border-right-color:var(--ag-tab-selected-border-color)}}}.ag-rtl .ag-tab{&.ag-tab-selected{&:not(:first-of-type){border-right-color:var(--ag-tab-selected-border-color)}&:not(:last-of-type){border-left-color:var(--ag-tab-selected-border-color)}}}";
135
-
136
- const tabStyleOdx = createPart({
137
- feature: "tabStyle",
138
- params: {
139
- tabBarBackgroundColor: "transparent",
140
- tabBarHorizontalPadding: 0,
141
- tabBarTopPadding: 0,
142
- tabBackgroundColor: "transparent",
143
- tabTextColor: {
144
- ref: "textColor"
145
- },
146
- tabHorizontalPadding: {
147
- ref: "spacing"
148
- },
149
- tabTopPadding: {
150
- ref: "spacing"
151
- },
152
- tabBottomPadding: {
153
- ref: "spacing"
154
- },
155
- tabSpacing: "0",
156
- tabHoverBackgroundColor: {
157
- ref: "tabBackgroundColor"
158
- },
159
- tabHoverTextColor: {
160
- ref: "tabTextColor"
161
- },
162
- tabSelectedBackgroundColor: {
163
- ref: "tabBackgroundColor"
164
- },
165
- tabSelectedTextColor: {
166
- ref: "tabTextColor"
167
- },
168
- tabSelectedBorderWidth: {
169
- ref: "borderWidth"
170
- },
171
- tabSelectedBorderColor: "transparent",
172
- tabSelectedUnderlineColor: "transparent",
173
- tabSelectedUnderlineWidth: 0,
174
- tabSelectedUnderlineTransitionDuration: 0,
175
- tabBarBorder: false
176
- },
177
- css: styles$1
178
- });
179
-
180
- const styles = ".ag-header-cell,.ag-picker-field-wrapper,.ag-select-list-item,.ag-select-list-item:after{transition:var(--odx-motion-transition-reduced);transition-property:background-color}.ag-filter-apply-panel-button{line-height:1.5em}.ag-picker-field-wrapper{--ag-focus-shadow:var(--odx-focus-ring-inner);border-bottom:var(--odx-border-width-thin)solid var(--odx-color-stroke-control-rest);border-radius:var(--odx-border-radius-control);background-color:var(--odx-color-background-control-rest);cursor:pointer;min-width:var(--odx-control-width-lg);&:focus-within{outline:var(--odx-focus-ring-outer)}}.ag-select-list{border-radius:var(--odx-border-radius-control);box-shadow:var(--odx-elevation-shadow-level-1);background-color:var(--odx-color-background-level-2);.ag-select-list-item{border:var(--odx-border-width-thin)solid transparent;cursor:pointer;padding-inline:calc(var(--odx-control-spacing-inline-md) - var(--odx-border-width-thin));height:var(--odx-control-height-md);touch-action:manipulation;display:flex;&.ag-active-item{background-color:var(--odx-color-background-transparent-selected-hover)}}}.ag-header-cell-text{flex:1}.ag-paging-panel .ag-paging-row-summary-panel-number{font-weight:var(--odx-typography-font-weight-semibold)}.ag-cell-focus:not(.ag-cell-range-selected):focus-within,.ag-cell-focus:not(.ag-cell-range-selected).pseudo-focus-within,.pseudo-focus-within-all .ag-cell-focus:not(.ag-cell-range-selected),.ag-cell-range-single-cell,.ag-cell-range-single-cell.ag-cell-range-handle,.ag-context-menu-open .ag-cell-focus:not(.ag-cell-range-selected),.ag-context-menu-open .ag-full-width-row.ag-row-focus .ag-cell-wrapper.ag-row-group,.ag-full-width-row.ag-row-focus:focus .ag-cell-wrapper.ag-row-group,.ag-full-width-row.ag-row-focus.pseudo-focus .ag-cell-wrapper.ag-row-group,.pseudo-focus-all .ag-full-width-row.ag-row-focus .ag-cell-wrapper.ag-row-group{border-width:var(--odx-border-width-thick)}";
181
-
182
- const coreStylesOdx = createPart({
183
- feature: "coreStyles",
184
- css: styles
185
- });
186
-
187
- const themeOdx = createTheme().withPart(iconSetOdx).withParams({
188
- accentColor: token("color.foreground.rest"),
189
- wrapperBorder: false,
190
- wrapperBorderRadius: token("border-radius.md"),
191
- borderRadius: token("border-radius.md"),
192
- foregroundColor: token("color.foreground.rest"),
193
- borderColor: token("color.stroke.neutral.subtle"),
194
- backgroundColor: token("color.background.level-1"),
195
- headerBackgroundColor: "transparent",
196
- headerColumnResizeHandleColor: token("color.stroke.control.rest"),
197
- headerRowBorder: {
198
- style: "solid",
199
- color: token("color.stroke.control.rest"),
200
- width: token("border-width.thin")
201
- },
202
- fontFamily: token("typography.font-family.base"),
203
- fontSize: token("typography.font-size.base"),
204
- headerFontWeight: token("typography.font-weight.semibold"),
205
- rowBorder: {
206
- style: "solid",
207
- color: token("color.stroke.neutral.subtle"),
208
- width: token("border-width.thin")
209
- },
210
- rowHeight: token("size.300"),
211
- rowHoverColor: token("color.background.transparent.hover"),
212
- oddRowBackgroundColor: token("color.background.transparent.hover"),
213
- selectedRowBackgroundColor: token("color.background.transparent.selected"),
214
- cellHorizontalPadding: token("spacing.75"),
215
- pinnedColumnBorder: {
216
- width: token("border-width.thin"),
217
- style: "solid",
218
- color: token("color.stroke.control.rest")
219
- },
220
- rangeSelectionBorderColor: token("color.stroke.focus.outer"),
221
- iconSize: token("control.addon-size-sm"),
222
- iconButtonActiveColor: token("color.foreground.rest"),
223
- iconButtonActiveBackgroundColor: token("color.background.transparent.hover"),
224
- iconButtonColor: token("color.foreground.rest"),
225
- iconButtonBackgroundColor: "transparent",
226
- iconButtonActiveIndicatorColor: token("color.foreground.rest"),
227
- iconButtonHoverBackgroundColor: token("color.background.transparent.hover"),
228
- iconColor: token("color.foreground.rest"),
229
- invalidColor: token("color.background.warning.rest"),
230
- browserColorScheme: "inherit",
231
- menuBackgroundColor: token("color.background.level-2"),
232
- menuBorder: "none",
233
- menuShadow: token("elevation.shadow.level-2"),
234
- menuTextColor: token("color.foreground.rest"),
235
- widgetVerticalSpacing: token("spacing.100"),
236
- footerRowBorder: {
237
- style: "solid",
238
- color: token("color.stroke.control.rest"),
239
- width: token("border-width.thin")
240
- },
241
- focusShadow: {
242
- color: token("color.stroke.focus.outer"),
243
- offsetX: 0,
244
- offsetY: 0,
245
- spread: {
246
- calc: "var(--odx-focus-ring-offset) * -1"
247
- }
248
- }
249
- }).withPart(coreStylesOdx);
250
-
251
- export { buttonStyleOdx, checkboxStyleOdx, getIconContent, iconSetOdx, inputStyleOdx, tabStyleOdx, themeOdx };
1
+ export { buttonStyleOdx } from './lib/parts/button-style.js';
2
+ export { checkboxStyleOdx } from './lib/parts/checkbox-style.js';
3
+ export { getIconContent, iconSetOdx } from './lib/parts/icon-set.js';
4
+ export { inputStyleOdx } from './lib/parts/input-style.js';
5
+ export { tabStyleOdx } from './lib/parts/tab-style.js';
6
+ export { themeOdx } from './lib/theme.js';
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@odx/addon-ag-grid",
3
3
  "displayName": "ODX AG Grid Theming Addon",
4
4
  "description": "A package providing integration and enhancements for ag-Grid within the ODX Foundation project",
5
- "version": "1.2.2",
5
+ "version": "1.3.0",
6
6
  "author": "Drägerwerk AG & Co.KGaA",
7
7
  "license": "SEE LICENSE IN LICENSE",
8
8
  "homepage": "https://odx.draeger.com",
@@ -14,26 +14,27 @@
14
14
  ],
15
15
  "type": "module",
16
16
  "dependencies": {
17
- "ag-grid-community": "^35.0.0"
17
+ "ag-grid-community": "^35.1.0"
18
18
  },
19
19
  "peerDependencies": {
20
20
  "@odx/icons": "^4.2.0",
21
- "@odx/design-tokens": "^3.3.0"
21
+ "@odx/design-tokens": "^4.0.2"
22
22
  },
23
23
  "devDependencies": {
24
- "@odx/icons": "4.2.1",
24
+ "@odx/icons": "4.5.1",
25
25
  "lit": "3.3.2",
26
- "stylelint": "16.26.1",
26
+ "stylelint": "17.5.0",
27
27
  "@odx-internal/config-stylelint": "0.0.0",
28
28
  "@odx-internal/config-typescript": "0.0.0",
29
29
  "@odx-internal/config-vite": "0.0.0",
30
- "@odx/design-tokens": "3.3.0"
30
+ "@odx/design-tokens": "4.0.2"
31
31
  },
32
32
  "sideEffects": [],
33
33
  "exports": {
34
34
  ".": {
35
35
  "import": "./dist/main.js",
36
- "types": "./dist/main.d.ts"
36
+ "types": "./dist/main.d.ts",
37
+ "default": "./dist/main.js"
37
38
  }
38
39
  },
39
40
  "publishConfig": {