From 20fac6324737b58781d3faa9f3c65745f2ea6005 Mon Sep 17 00:00:00 2001 From: Lee Chase Date: Fri, 8 Nov 2024 19:56:42 +0000 Subject: [PATCH 1/9] chore: wip --- .../web-components/src/components/grid/col.ts | 61 +++++++++++++++++ .../src/components/grid/defs.ts | 19 ++++++ .../src/components/grid/grid.mdx | 33 ++++++++++ .../src/components/grid/grid.scss | 16 +++++ .../src/components/grid/grid.stories.ts | 26 ++++++++ .../src/components/grid/grid.ts | 66 +++++++++++++++++++ .../src/components/grid/index.ts | 11 ++++ 7 files changed, 232 insertions(+) create mode 100644 packages/web-components/src/components/grid/col.ts create mode 100644 packages/web-components/src/components/grid/defs.ts create mode 100644 packages/web-components/src/components/grid/grid.mdx create mode 100644 packages/web-components/src/components/grid/grid.scss create mode 100644 packages/web-components/src/components/grid/grid.stories.ts create mode 100644 packages/web-components/src/components/grid/grid.ts create mode 100644 packages/web-components/src/components/grid/index.ts diff --git a/packages/web-components/src/components/grid/col.ts b/packages/web-components/src/components/grid/col.ts new file mode 100644 index 000000000000..cd48b7b987fe --- /dev/null +++ b/packages/web-components/src/components/grid/col.ts @@ -0,0 +1,61 @@ +/** + * @license + * + * Copyright IBM Corp. 2024, 2024 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { LitElement, html } from 'lit'; +import { property } from 'lit/decorators.js'; +import { carbonElement as customElement } from '../../globals/decorators/carbon-element'; +import { prefix } from '../../globals/settings'; +import styles from './col.scss?lit'; + +@customElement(`${prefix}-col`) +class CDSCol extends LitElement { + /** + * Specify col alignment. Default is center + */ + @property({ attribute: 'align' }) + align = GRID_ALIGNMENT.CENTER; + + /** + * Collapse the gutter to 1px. Useful for fluid layouts. + * Rows have 1px of margin between them to match gutter. + */ + @property({ attribute: 'condensed' }) + condensed = false; + + /** + * Container hangs 16px into the gutter. Useful for + * typographic alignment with and without containers. + */ + @property({ attribute: 'narrow' }) + narrow = false; + + /** + * Col is nested within another col + */ + @property({ attribute: 'sub-col' }) + subCol = false; + + /** + * Remove the default max width that the col has set + */ + @property({ reflect: true, attribute: 'wide' }) + wide = false; + + render() { + const classes = 'cds--col'; + + // Col styling added to contained components, allowing CSS Col + // to affect the it's own slot content. + return html`
+ +
`; + } +} + +export default CDSCol; diff --git a/packages/web-components/src/components/grid/defs.ts b/packages/web-components/src/components/grid/defs.ts new file mode 100644 index 000000000000..960591e3bb8b --- /dev/null +++ b/packages/web-components/src/components/grid/defs.ts @@ -0,0 +1,19 @@ +/** + * Button size. + */ +export enum GRID_ALIGNMENT { + /** + * Align to start. + */ + START = 'start', + + /** + * Align in center + */ + CENTER = 'center', + + /** + * Align to end + */ + END = 'end', +} diff --git a/packages/web-components/src/components/grid/grid.mdx b/packages/web-components/src/components/grid/grid.mdx new file mode 100644 index 000000000000..fe3518db3786 --- /dev/null +++ b/packages/web-components/src/components/grid/grid.mdx @@ -0,0 +1,33 @@ +import { ArgTypes, Meta, Markdown } from '@storybook/blocks'; +import { cdnJs, cdnCss } from '../../globals/internal/storybook-cdn'; +import * as GridStories from './grid.stories'; + + + +# Grid + +> 💡 Check our +> [Stackblitz](https://stackblitz.com/github/carbon-design-system/carbon/tree/main/packages/web-components/examples/components/grid) +> example implementation. + +[![Edit carbon-web-components](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/carbon-design-system/carbon/tree/main/packages/web-components/examples/components/grid) + +## Getting started + +Here's a quick example to get you started. + +### JS (via import) + +```javascript +import '@carbon/web-components/es/components/grid/index.js'; +``` + +### HTML + +```html +
Bye then
+``` + +## `` attributes, properties and events + + diff --git a/packages/web-components/src/components/grid/grid.scss b/packages/web-components/src/components/grid/grid.scss new file mode 100644 index 000000000000..f69c06f244eb --- /dev/null +++ b/packages/web-components/src/components/grid/grid.scss @@ -0,0 +1,16 @@ +// +// Copyright IBM Corp. 2024, 2024 +// +// This source code is licensed under the Apache-2.0 license found in the +// LICENSE file in the root directory of this source tree. +// +@use '@carbon/styles/scss/config' as *; +@use '@carbon/grid/scss/css-grid.scss' as *; + +:host(#{$prefix}-grid) { + @extend .#{$prefix}--css-grid; + + ::slotted(#{$prefix}-col) { + @extend .#{$prefix}--css-grid-column; + } +} diff --git a/packages/web-components/src/components/grid/grid.stories.ts b/packages/web-components/src/components/grid/grid.stories.ts new file mode 100644 index 000000000000..9fb0e783712f --- /dev/null +++ b/packages/web-components/src/components/grid/grid.stories.ts @@ -0,0 +1,26 @@ +/** + * @license + * + * Copyright IBM Corp. 2019, 2024 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { html } from 'lit'; +import './index'; + +export const Default = { + parameters: { + percy: { + skip: true, + }, + }, + render: () => html`
hello world
`, +}; + +const meta = { + title: 'Components/Grid', +}; + +export default meta; diff --git a/packages/web-components/src/components/grid/grid.ts b/packages/web-components/src/components/grid/grid.ts new file mode 100644 index 000000000000..0bcc0e6a614d --- /dev/null +++ b/packages/web-components/src/components/grid/grid.ts @@ -0,0 +1,66 @@ +/** + * @license + * + * Copyright IBM Corp. 2024, 2024 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { LitElement, html } from 'lit'; +import { property } from 'lit/decorators.js'; +import { carbonElement as customElement } from '../../globals/decorators/carbon-element'; +import { prefix } from '../../globals/settings'; +import styles from './grid.scss?lit'; +import { GRID_ALIGNMENT } from './defs'; + +export { GRID_ALIGNMENT } from './defs'; + +@customElement(`${prefix}-grid`) +class CDSGrid extends LitElement { + /** + * Specify grid alignment. Default is center + */ + @property({ attribute: 'align' }) + align = GRID_ALIGNMENT.CENTER; + + /** + * Collapse the gutter to 1px. Useful for fluid layouts. + * Rows have 1px of margin between them to match gutter. + */ + @property({ attribute: 'condensed' }) + condensed = false; + + /** + * Container hangs 16px into the gutter. Useful for + * typographic alignment with and without containers. + */ + @property({ attribute: 'narrow' }) + narrow = false; + + /** + * Grid is nested within another grid + */ + @property({ attribute: 'sub-grid' }) + subGrid = false; + + /** + * Remove the default max width that the grid has set + */ + @property({ reflect: true, attribute: 'wide' }) + wide = false; + + render() { + const classes = 'cds--css-grid'; + + // Grid styling added to contained components, allowing CSS Grid + // to affect the it's own slot content. + return html`
+ +
`; + } + + static styles = styles; +} + +export default CDSGrid; diff --git a/packages/web-components/src/components/grid/index.ts b/packages/web-components/src/components/grid/index.ts new file mode 100644 index 000000000000..a210a614fdbb --- /dev/null +++ b/packages/web-components/src/components/grid/index.ts @@ -0,0 +1,11 @@ +/** + * @license + * + * Copyright IBM Corp. 2024, 2024 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +import './grid'; +import './col'; From 2b70ad9e63a82869114496b6aff924ad338a11b3 Mon Sep 17 00:00:00 2001 From: Lee Chase Date: Sun, 10 Nov 2024 20:29:38 +0000 Subject: [PATCH 2/9] feat: grid wip --- .../web-components/src/components/grid/col.ts | 61 ------- .../src/components/grid/column.ts | 28 +++ .../src/components/grid/defs.ts | 20 +++ .../src/components/grid/grid-story.scss | 108 ++++++++++++ .../src/components/grid/grid.mdx | 7 +- .../src/components/grid/grid.scss | 36 +++- .../src/components/grid/grid.stories.ts | 162 +++++++++++++++++- .../src/components/grid/grid.ts | 15 +- .../src/components/grid/index.ts | 3 +- .../src/components/grid/mixin.scss | 48 ++++++ .../src/components/grid/sub-grid.scss | 31 ++++ .../src/components/grid/sub-grid.ts | 37 ++++ 12 files changed, 477 insertions(+), 79 deletions(-) delete mode 100644 packages/web-components/src/components/grid/col.ts create mode 100644 packages/web-components/src/components/grid/column.ts create mode 100644 packages/web-components/src/components/grid/grid-story.scss create mode 100644 packages/web-components/src/components/grid/mixin.scss create mode 100644 packages/web-components/src/components/grid/sub-grid.scss create mode 100644 packages/web-components/src/components/grid/sub-grid.ts diff --git a/packages/web-components/src/components/grid/col.ts b/packages/web-components/src/components/grid/col.ts deleted file mode 100644 index cd48b7b987fe..000000000000 --- a/packages/web-components/src/components/grid/col.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @license - * - * Copyright IBM Corp. 2024, 2024 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { LitElement, html } from 'lit'; -import { property } from 'lit/decorators.js'; -import { carbonElement as customElement } from '../../globals/decorators/carbon-element'; -import { prefix } from '../../globals/settings'; -import styles from './col.scss?lit'; - -@customElement(`${prefix}-col`) -class CDSCol extends LitElement { - /** - * Specify col alignment. Default is center - */ - @property({ attribute: 'align' }) - align = GRID_ALIGNMENT.CENTER; - - /** - * Collapse the gutter to 1px. Useful for fluid layouts. - * Rows have 1px of margin between them to match gutter. - */ - @property({ attribute: 'condensed' }) - condensed = false; - - /** - * Container hangs 16px into the gutter. Useful for - * typographic alignment with and without containers. - */ - @property({ attribute: 'narrow' }) - narrow = false; - - /** - * Col is nested within another col - */ - @property({ attribute: 'sub-col' }) - subCol = false; - - /** - * Remove the default max width that the col has set - */ - @property({ reflect: true, attribute: 'wide' }) - wide = false; - - render() { - const classes = 'cds--col'; - - // Col styling added to contained components, allowing CSS Col - // to affect the it's own slot content. - return html`
- -
`; - } -} - -export default CDSCol; diff --git a/packages/web-components/src/components/grid/column.ts b/packages/web-components/src/components/grid/column.ts new file mode 100644 index 000000000000..d2d3e9653cb8 --- /dev/null +++ b/packages/web-components/src/components/grid/column.ts @@ -0,0 +1,28 @@ +/** + * @license + * + * Copyright IBM Corp. 2024, 2024 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { LitElement, html } from 'lit'; +import { property } from 'lit/decorators.js'; +import { carbonElement as customElement } from '../../globals/decorators/carbon-element'; +import { prefix } from '../../globals/settings'; + +@customElement(`${prefix}-column`) +class CDSColumn extends LitElement { + /** + * Specify grid alignment. Default is center + */ + @property({ reflect: true, attribute: 'sm' }) + sm = '1'; + + createRenderRoot() { + return this; + } +} + +export default CDSColumn; diff --git a/packages/web-components/src/components/grid/defs.ts b/packages/web-components/src/components/grid/defs.ts index 960591e3bb8b..d6403fa3f9d0 100644 --- a/packages/web-components/src/components/grid/defs.ts +++ b/packages/web-components/src/components/grid/defs.ts @@ -17,3 +17,23 @@ export enum GRID_ALIGNMENT { */ END = 'end', } + +/** + * Button type. + */ +export enum SUB_GRID_MODE { + /** + * Default sug-grid mode. + */ + WIDE = 'wide', + + /** + * Condensed sub-grid (should match hosting grid). + */ + CONDENSED = 'condensed', + + /** + * Narrow sub-grid (should match hosting grid). + */ + NARROW = 'narrow', +} diff --git a/packages/web-components/src/components/grid/grid-story.scss b/packages/web-components/src/components/grid/grid-story.scss new file mode 100644 index 000000000000..db5ee8ae3ebb --- /dev/null +++ b/packages/web-components/src/components/grid/grid-story.scss @@ -0,0 +1,108 @@ +@use '@carbon/styles/scss/grid'; +@use '@carbon/styles/scss/colors' as *; +@use '@carbon/styles/scss/type' as *; +@use '@carbon/styles/scss/spacing' as *; + +:root { + @include grid.css-grid(); +} + +.sb-css-grid-container { + // Gutter modes + cds-grid::part(grid) { + background-color: $blue-20; + outline: 1px dashed $blue-40; + // row-gap: $spacing-05; + } + + // .cds--css-grid p { + // @include type-style('code-02'); + // } + + // .cds--css-grid p:first-of-type { + // margin-block-start: 0; + // } + + // Narrow + cds-grid[narrow]::part(grid) { + background-color: #d6f9f9; + outline: 1px dashed $green-40; + } + + // Condensed + cds-grid[condensed]::part(grid) { + background-color: $purple-10; + outline: 1px dashed $purple-40; + } + + cds-sub-grid::part(grid) { + position: relative; + background: #eef4ff; + outline: 1px solid black; + padding-block: 2rem; + } + + cds-sub-grid::part(grid), + cds-sub-grid[mode='wide']::part(grid) { + --grid-mode-color: #97c1ff; + } + + cds-rid[narrow]::part(grid), + cds-sub-grid[mode='narrow']::part(grid) { + --grid-mode-color: #20d5d2; + + background: $green-10; + } + + cds-grid[condensed]::part(grid), + cds-sub-grid[mode='condensed']::part(grid) { + --grid-mode-color: #bb8eff; + + background: $purple-10; + } + + cds-sub-grid[mode='narrow']::part(grid) { + background: #d6f9f9; + } + + cds-sub-grid[mode='condensed']::part(grid) { + background: #f7f2ff; + } + + cds-sub-grid::part(grid)::before { + @include type-style('code-01'); + + position: absolute; + display: block; + padding: 0.125rem 0.25rem; + background: var(--grid-mode-color, #97c1ff); + color: $black; + content: 'subgrid'; + inset-block-start: 0; + inset-inline-start: 0; + } + + // // Column + cds-column { + --border-color: #97c1ff; + + background: $white; + box-shadow: 0 0 0 1px var(--border-color); + + min-block-size: 80px; + } + + cds-sub-grid[mode='narrow']::part(grid) cds-column, + cds-grid[narrow]::part(grid) cds-column { + --border-color: #20d5d2; + } + + cds-sub-grid[mode='condensed']::part(grid) cds-column, + cds-grid[condensed]::part(grid) cds-column { + --border-color: #bb8eff; + } +} + +.cds--grid-part cds-column cds-grid::part(grid) { + box-shadow: 0 0 5px black; +} diff --git a/packages/web-components/src/components/grid/grid.mdx b/packages/web-components/src/components/grid/grid.mdx index fe3518db3786..d630b528f115 100644 --- a/packages/web-components/src/components/grid/grid.mdx +++ b/packages/web-components/src/components/grid/grid.mdx @@ -22,10 +22,15 @@ Here's a quick example to get you started. import '@carbon/web-components/es/components/grid/index.js'; ``` +{`${cdnJs({ components: ['grid'] })}`} +{`${cdnCss()}`} + ### HTML ```html -
Bye then
+111 + ``` ## `` attributes, properties and events diff --git a/packages/web-components/src/components/grid/grid.scss b/packages/web-components/src/components/grid/grid.scss index f69c06f244eb..06ca64f4bcf1 100644 --- a/packages/web-components/src/components/grid/grid.scss +++ b/packages/web-components/src/components/grid/grid.scss @@ -5,12 +5,36 @@ // LICENSE file in the root directory of this source tree. // @use '@carbon/styles/scss/config' as *; -@use '@carbon/grid/scss/css-grid.scss' as *; +// @use '@carbon/styles/scss/grid/css-grid' as *; +@use '@carbon/styles/scss/grid'; +@use './mixin' as *; -:host(#{$prefix}-grid) { - @extend .#{$prefix}--css-grid; +$css-grid: #{$prefix}--css-grid; +:host(#{$prefix}-grid) .#{$prefix}--grid-part { + @extend .#{$css-grid}; - ::slotted(#{$prefix}-col) { - @extend .#{$prefix}--css-grid-column; - } + box-sizing: border-box; /* prevent padding leaking out */ } + +// :host(#{$prefix}-grid[align='start']) .#{$prefix}--grid-part { +// @extend .#{$css-grid}--start; +// } + +// :host(#{$prefix}-grid[align='end']) .#{$prefix}--grid-part { +// @extend .#{$css-grid}--end; +// } + +:host(#{$prefix}-grid[condensed]) .#{$prefix}--grid-part { + @extend .#{$css-grid}--condensed; +} + +:host(#{$prefix}-grid[narrow]) .#{$prefix}--grid-part { + @extend .#{$css-grid}--narrow; +} + +:host(#{$prefix}-grid[full-width]) .#{$prefix}--grid-part { + @extend .#{$css-grid}--full-width; +} + +// Column styles +@include grid-columns(#{$prefix}-grid); diff --git a/packages/web-components/src/components/grid/grid.stories.ts b/packages/web-components/src/components/grid/grid.stories.ts index 9fb0e783712f..9f081e2d92f6 100644 --- a/packages/web-components/src/components/grid/grid.stories.ts +++ b/packages/web-components/src/components/grid/grid.stories.ts @@ -9,18 +9,178 @@ import { html } from 'lit'; import './index'; +import styles from './grid-story.scss?lit'; + +const defaultArgs = { + condensed: false, + narrow: false, + fullWidth: false, +}; + +const controls = { + condensed: { + control: 'boolean', + description: `Collapse gutter to 1px.`, + }, + narrow: { + control: 'boolean', + description: `Hangs 16px into gutter.`, + }, + fullWidth: { + control: 'boolean', + description: 'Remove the default max width', + }, +}; export const Default = { + args: defaultArgs, + argTypes: controls, parameters: { percy: { skip: true, }, }, - render: () => html`
hello world
`, + render: ({ condensed, narrow, fullWidth }) => + html` + + + + + + `, +}; + +export const Offset = { + args: defaultArgs, + argTypes: controls, + parameters: { + percy: { + skip: true, + }, + }, + render: ({ condensed, narrow, fullWidth }) => + html` + + + + + + + `, +}; + +export const SubGrid = { + args: defaultArgs, + argTypes: controls, + parameters: { + percy: { + skip: true, + }, + }, + render: ({ condensed, narrow, fullWidth }) => + html` + +

Small: Span 2 of 4

+

Medium: Span 4 of 8

+

Large: Span 3 of 16

+
+ +

Small: Span 2 of 4

+

Medium: Span 4 of 8

+

Large: Span 10 of 16

+ + +

sm="1"

+

md="1"

+

lg="2"

+
+ +

sm="1"

+

md="1"

+

lg="2"

+
+ +

sm="0"

+

md="1"

+

lg="1"

+
+ +

sm="0"

+

md="1"

+

lg="1"

+
+ +

sm="0"

+

md="0"

+

lg="1"

+
+ +

sm="0"

+

md="0"

+

lg="1"

+
+ +

sm="0"

+

md="0"

+

lg="1"

+
+ +

sm="0"

+

md="0"

+

lg="1"

+
+
+
+ +

Small: Span 0 of 4

+

Medium: Span 0 of 8

+

Large: Span 3 of 16

+
+
+ `, }; const meta = { title: 'Components/Grid', + decorators: [ + (story, { name }) => { + const width = !name.toLowerCase().includes('layer') ? `width:300px` : ``; + return html`
${story()}
`; + }, + ], }; export default meta; + +// +// +// +// +// diff --git a/packages/web-components/src/components/grid/grid.ts b/packages/web-components/src/components/grid/grid.ts index 0bcc0e6a614d..29713f09fa52 100644 --- a/packages/web-components/src/components/grid/grid.ts +++ b/packages/web-components/src/components/grid/grid.ts @@ -13,7 +13,6 @@ import { carbonElement as customElement } from '../../globals/decorators/carbon- import { prefix } from '../../globals/settings'; import styles from './grid.scss?lit'; import { GRID_ALIGNMENT } from './defs'; - export { GRID_ALIGNMENT } from './defs'; @customElement(`${prefix}-grid`) @@ -28,34 +27,32 @@ class CDSGrid extends LitElement { * Collapse the gutter to 1px. Useful for fluid layouts. * Rows have 1px of margin between them to match gutter. */ - @property({ attribute: 'condensed' }) + @property({ reflect: true, attribute: 'condensed', type: Boolean }) condensed = false; /** * Container hangs 16px into the gutter. Useful for * typographic alignment with and without containers. */ - @property({ attribute: 'narrow' }) + @property({ reflect: true, attribute: 'narrow', type: Boolean }) narrow = false; /** * Grid is nested within another grid */ - @property({ attribute: 'sub-grid' }) + @property({ reflect: true, attribute: 'sub-grid', type: Boolean }) subGrid = false; /** * Remove the default max width that the grid has set */ - @property({ reflect: true, attribute: 'wide' }) - wide = false; + @property({ reflect: true, attribute: 'full-width', type: Boolean }) + fullWidth = false; render() { - const classes = 'cds--css-grid'; - // Grid styling added to contained components, allowing CSS Grid // to affect the it's own slot content. - return html`
+ return html`
`; } diff --git a/packages/web-components/src/components/grid/index.ts b/packages/web-components/src/components/grid/index.ts index a210a614fdbb..bf57b1cb5d78 100644 --- a/packages/web-components/src/components/grid/index.ts +++ b/packages/web-components/src/components/grid/index.ts @@ -8,4 +8,5 @@ */ import './grid'; -import './col'; +import './column'; +import './sub-grid'; diff --git a/packages/web-components/src/components/grid/mixin.scss b/packages/web-components/src/components/grid/mixin.scss new file mode 100644 index 000000000000..b09a13f593a2 --- /dev/null +++ b/packages/web-components/src/components/grid/mixin.scss @@ -0,0 +1,48 @@ +@use '@carbon/styles/scss/config' as *; +@use '@carbon/styles/scss/grid'; + +@mixin grid-columns($grid-component) { + $cols: ( + sm: 4, + md: 8, + lg: 16, + ); + + :host(#{$grid-component}) ::slotted(#{$prefix}-column) { + @extend .#{$prefix}--css-grid-column; + } + + @each $key, $value in $cols { + @for $i from 1 through $value { + :host(#{$grid-component}) ::slotted(#{$prefix}-column[#{$key}='#{$i}']), + :host(#{$grid-component}) + ::slotted(#{$prefix}-column[#{$key}*='span:#{$i}']) { + @extend .cds--#{$key}\:col-span-#{$i}; + } + + :host(#{$grid-component}) + ::slotted(#{$prefix}-column[#{$key}*='start:#{$i}']) { + @extend .cds--#{$key}\:col-start-#{$i}; + } + + // span 0 + :host(#{$grid-component}) ::slotted(#{$prefix}-column[#{$key}='0']), + :host(#{$grid-component}) + ::slotted(#{$prefix}-column[#{$key}*='span:0']) { + @extend .cds--#{$key}\:col-span-0; + } + + // percent after others otherwise span:2 beats span:25% + @for $p from 1 through 4 { + $percent: $p * 25; + + :host(#{$grid-component}) + ::slotted(#{$prefix}-column[#{$key}='#{$percent}%']), + :host(#{$grid-component}) + ::slotted(#{$prefix}-column[#{$key}*='span:#{$percent}%']) { + @extend .cds--#{$key}\:col-span-#{$percent}; + } + } + } + } +} diff --git a/packages/web-components/src/components/grid/sub-grid.scss b/packages/web-components/src/components/grid/sub-grid.scss new file mode 100644 index 000000000000..9eb62a489fa2 --- /dev/null +++ b/packages/web-components/src/components/grid/sub-grid.scss @@ -0,0 +1,31 @@ +// +// Copyright IBM Corp. 2024, 2024 +// +// This source code is licensed under the Apache-2.0 license found in the +// LICENSE file in the root directory of this source tree. +// +@use '@carbon/styles/scss/config' as *; +@use '@carbon/styles/scss/grid'; +@use './mixin' as *; + +$sub-grid: #{$prefix}--subgrid; + +:host(#{$prefix}-sub-grid) .#{$prefix}--grid-part { + @extend .#{$sub-grid}; + + box-sizing: border-box; /* prevent padding leaking out */ +} + +:host(#{$prefix}-sub-grid[mode='wide']) .#{$prefix}--grid-part { + @extend .#{$sub-grid}--wide; +} + +:host(#{$prefix}-sub-grid[mode='condensed']) .#{$prefix}--grid-part { + @extend .#{$sub-grid}--condensed; +} + +:host(#{$prefix}-sub-grid[mode='narrow']) .#{$prefix}--grid-part { + @extend .#{$sub-grid}--narrow; +} + +@include grid-columns(#{$prefix}-sub-grid); diff --git a/packages/web-components/src/components/grid/sub-grid.ts b/packages/web-components/src/components/grid/sub-grid.ts new file mode 100644 index 000000000000..e78e8c9ee6d2 --- /dev/null +++ b/packages/web-components/src/components/grid/sub-grid.ts @@ -0,0 +1,37 @@ +/** + * @license + * + * Copyright IBM Corp. 2024, 2024 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { LitElement, html } from 'lit'; +import { property } from 'lit/decorators.js'; +import { carbonElement as customElement } from '../../globals/decorators/carbon-element'; +import { prefix } from '../../globals/settings'; +import styles from './sub-grid.scss?lit'; +import { SUB_GRID_MODE } from './defs'; +export { SUB_GRID_MODE } from './defs'; + +@customElement(`${prefix}-sub-grid`) +class CDSSubGrid extends LitElement { + /** + * Remove the default max width that the grid has set + */ + @property({ reflect: true, attribute: 'mode' }) + mode = SUB_GRID_MODE.WIDE; + + render() { + // Grid styling added to contained components, allowing CSS Grid + // to affect the it's own slot content. + return html`
+ +
`; + } + + static styles = styles; +} + +export default CDSSubGrid; From ed1c90801ea16917fe2de88172c3ed080af7fe45 Mon Sep 17 00:00:00 2001 From: Lee Chase Date: Mon, 11 Nov 2024 10:52:28 +0000 Subject: [PATCH 3/9] feat: add grid and column web components --- ...ontext-npm-1.1.3-61f4185ab1-d2ceb8a74e.zip | Bin 0 -> 97005 bytes packages/web-components/package.json | 1 + .../src/components/grid/grid-context.ts | 8 + .../src/components/grid/grid.stories.ts | 176 ++++++++++++++---- .../src/components/grid/grid.ts | 17 +- .../src/components/grid/sub-grid.ts | 40 ++++ yarn.lock | 12 +- 7 files changed, 213 insertions(+), 41 deletions(-) create mode 100644 .yarn/cache/@lit-context-npm-1.1.3-61f4185ab1-d2ceb8a74e.zip create mode 100644 packages/web-components/src/components/grid/grid-context.ts diff --git a/.yarn/cache/@lit-context-npm-1.1.3-61f4185ab1-d2ceb8a74e.zip b/.yarn/cache/@lit-context-npm-1.1.3-61f4185ab1-d2ceb8a74e.zip new file mode 100644 index 0000000000000000000000000000000000000000..33f56871c52d3cd4059fbb54d9132336c557cd07 GIT binary patch literal 97005 zcmeFYW0a&@w(p&`ZQFKMrES}`ZQHhuO53*W%*xD48_vs#|cc0VyzUSPpH^z7( z;=_8@h-bxr{wCI3a+1IxC;)%F_-d9R{`TeXZ?IpVHnv8_y4JQv&Q`{b^m6}pDAKc|Lu4~TN@{1w}0FR1OV~3pA-!}<@OjPC*6|8pyFuOhVfT)>yuI_FmQV`4>kZGyJ78qW&AV>X zmsX#hIq=gaw(mD$MjbGaGx6jHM-yB3W_w+F&fadRzRd1eu;;bn+tWxd*iKuZB{q;) zUOElWs<|EEDjXi!=PxdpesARK5hAgjS911k{658BIaVz^a4|Rz20(c* z2Ml(ui>xe<#cWEbqgOjwQ-$ngaMPS-BlQGnQ z7^)SW@#&*_ZQu=vaVbkWV-LfEBzF0Rnp<`wynd{>`_RatAWodl=-Yl zP(Pc;NdpMm_k-gF$O$4@YMIrmkof>8B!JsCB?660q|7K@yI{vrt%4=kpT|;}Qcdu~ ztBNSimZ3uJ%UYS3svT?cDwLHi04XAk6-qf%HREaRxMV==iJ^c!2JYTssls1nu~LD= zZ;k2HvVy3X%Y`h&rY(~S97pM8`BaILQNnD2hU}VTr_(gNs_P&UX$~~IMXYT<^&u}w zs*_idOz-(uB(00eqy3!KO^jF;1hz(%e$mIJaZBayFaHZPkY<%;hUwKqm2o9g+Xofbdc^GINSZ1jWLYoD#+ya5u|q zn}rBgJ9eOrP(sK|kaJOpq~1(kR3eZybj2}UmS?(vP_M(#(Xv8fhjakt>4+D4)r#s^ zx%DESt9Jq>??6B2{`Uq<_LqibWb9&WWou_`Z1WG}{2KmWctQ35dk!megTH_S>;GsT zBV$8b2Yn}7hkx+tAKXZT7P+$j;)eAX)V}|3r~E>aqqDU!orPnUa-Yox2SV2|b;++j z2R-%3`=j2iB5~Kf;0DM96bd;Sy$CE#D@p}|a*l1j&uv0V&gQd6HJ|{Bo13ZYDQrq^ zUS5C2*0_Me`d`PY?b{f2RJd91_AX$)mR$)DcfXT$y;?gyvZjeSvQf*j)Sy_9pRet* zyCrK$EP*6lh$=L&!RZG}alUc4uayV@)6zuO=rQ1#W~D@>AVtGE1{8M=ME9)s{T4@? z&)nMF+WxNd@yg-f(+F5onZX$kO}PoS+@HK#wYx(hT>@oC+Mm4G%n0$x1Jam>K&+?W z(Y*c(3-*F0&T=4&4K1P5KCcm&F1?AHS`Z-uBRH5eem07eVogylg0l7b`8?Jg_eO0J zMWKp!wlrEj+)ezLb-ezQ;{XG)Y@#3V|`R&|(vf=1=!R_v6K zSOq2LN$ynDyYD0~5?zp*D)U$~H6XPpH)(g0%*=Ea(_fZ^gokmBfJP9)EBcK@O^IVT zV4@>kmZ`POBt*IQHJMh#Dtf-oAyB89uQ?1J*QHL-D09<+SgcDDwEfY80kUlwNxY2i z6{-AN2uFFlhqa&$BLr@GGn@0Cpu0w%g&4VouBd$e)=~6KRYA+vfkB+mqxvR-7>_K=&eT!iU<68FYTAQv zD&OtAaCWawkqd_X&0%gLo!tzS+^-RZGG(T7OhPpe9QMweC!<{+kY%IU030Ta98t3~ zTkBFuxyZyEYUz-+OKA+Lh0s;mE<%x7P+Wd&hkX7R%cuYn$coJjQ4Xv(I7eAyu6O3*9PKWI}^_``26J($6%%5QMe1EqZJh=XQSmFJpHUBkSDF2W5 z{#&5bn7Z%L00IE)d|k}{lWG1FBF^%25(9h)URSC(H>8wP!l#-fR3!w#5C(`KH+v3S zjjHr5dp3d9grAqi(RnDjE^C-3DVWOaX5|xe22({8u+SN38$r!wwwS{xZ_Za zFmbVZBhobohCI4hB9dlLp{+1JMnmLHcN68sG!IRBaEfNzQErJz>BBbxZ}yz_(HhSpuMA` z4EUWc?}wRNGAMdoY8D+^*5&VgwpTi|zFIoy1&}H#%-Sl=kJstvn6bHUv>z*ZcRg3) zrhuZW%gsTNG@4^>-BpFXNa{qdzvyaADlxWd?IHy{xOE*)td5hOUxXs=r= zC9GY3^l6p%O_OZ%E$h64ZHW zghX?$l-boa;6@T*K>TwH=pL;COWRKuV{Jx3qt@fD^^)m4`8`1r*AiHF6yp8 zma7T|Zq6RtCV6-qaL=>qhA1{o{7bpDD%a@Yz0HgXzyS#_NM-Vn4)km+MqDsS-x+p) zmiD*ji3l$#IhnMJ*Du3IE9kE|hw4RU6Tb$ppsqc%3)vj$=Y5hfP^`L#dGPbY+o^x@ z_?0*xTCJ_j4(+RIAzP&QJLDFyNl2b5V=+-Z0!rA6y^#FO#4;3ZLzYdN;{kC;nl)z` z_<7Umm=4__h(1U7jf&;nF&6RGt*qUOYJ09>b&jVhOm0 zQ$#F?ThTUAUpX~dL6!04Q{O5Ez^xhV-j;$3ds3Z70F&rC{Gfx7Kg%MI7$X&U?wZ!lX zYh2Mu+~!#>nnFs`g4Sji0c6e-CKn{Ntpt+Mno z6x@r_jX1JiwnA&R9vah|OXWRgsTMi1{GQF*LmNZO%f>UuQTJ|Z#$y^rRW6v(k_ahe zt7QUXvDI4A@zO3U;pc8pY9ZIX?(u-+WI^|wRm!`dul~)$Zxw5rgKEb2g zfF^lg9+i-PhyVA${Oid4uOUemXk*>?q}6M&l410YaZ;Wfj*qIRBl%6D4E{p%Z(p;ZNREa6YSn2vneut zuIeaUJKr{|2kq6BM=GCK*2WC(Vg5s7|46YKJW6rmzyJWKz6wbH_YTy~!Pdpx$oLNj zx}>K0wkTgsukDx?X4oR$U|*(8jUxuU7*{02LP-Mpg@1kQlRzz3;eA=U*y> zoCg4Y)f~isjyV3F9ucg@-Nz8zaaiE0 zT4Lk@g~rg{&3wqQWFFw0sjJt#z#CNq(stSp71!GsJR0W*lF5Kt9_r~L$A^8@<#Qz< zwyGF*K606$$_--wTvX72Zx69Vpa^=&1b>zV!Gfj2EzV>t zxd-kB=Jw1`=ijun0;9Ut0f&Y%XaolWnVI_h79pY)EyWIHFsVBc6A_dpz6we18WHVTTyO1-+u%d%tjvPtWM%j4#)j+p(A~HFG z2@(`NG06ndD(r-%Ug_vA5+X>bB1RPhYu%}jkdZO<>-x9b*wBBKAwT@qI$dLQq=Wz4|QSnOIq-CHQr%u1QXWR-sz&`bH^`Mf-?iDc?%MibJ=h7fKt(n7qE$Vs8lZv{eMp~YL zadEVNF&vRe2}*8V#ITyiN%a+G%4g%{?CsS1&|=AY$N4Ro53$JSZN_mB^phclQ{>@y zrekN7r458ZzlO}wQ~-1xcwH)lP|zl3@^u^*t}WLn+eEvPhzsMABA;lKjnbjSi_#>C zid5eU2yn-!WCy4c&5$upCaz>QFgu7am1fxh5)LugnVvTla>IAg3YAM1DCV=J8G|q^ zmq5KB4q+END0R|hgas49Fn&>*Ap6mG_Z?FcD?{{T05aU{vzKp~zHZMqMeMK(JO}c$ zoSp)&7aIT#mOEa(WG{Ka#Y^wPa9z||aMbO+Tr_e+VaE;bzC84P7TzlH@w8PR^d65i z7}Z)Gs};^IFmM+;CL7S6+n)2pB)3S>x@d@QECvMDw1EJn%r!$^$C2jsVWmds%7RI4W|EvUlsVNSWv5{18a4@N zwE-C=)HZ8Ezva=^M2Z(kXo3~EL(k^RH6^=}6rqiKnvGUglOc1s&{6oP@*n}r;Hwhd z=88jbMF^XZ)8sc*hAZu104&DD<6gNFchsuAT_p!_XqP_gCPy+}e_#2^iQ6f`*DEVD zPL+iR2;*E-FjmBMOmy@WNjt|w zHN61R`n_W7K>eL_9XnLQv)LpEya`>r;?O%4TLj2FAu|Pxx02IA(>H%qC1~VdtSW>9 z)Tf07l-g?L23^A`P5JNJl%D`lIu@E?Y;6~|c0=fEOC9t_uTuXcX3IA(jjT}U+4b3` z#2v7s!Q*<)saNbZsTD53NiJAT;wrHt#JEJ`$d#pWA}A{kmOlx?P|XOuv>^x1AO2xw zVBOZQ9ns7M`&10beq+UlKoFx{OVxJRGGE+kncOI>k;Im@U-!n7I*3vOtjlVbq-g_w z@*IxKjmv|QzEukc6I&?1%C1yehI95irYiXU@nY~TbO5qip3;#HS_M=DXF`xRoCE=} z-dSbk)2pI}nx9{sZqMlco}qo9?3YX=SI!b@dYFQwCJp|JDTyjFJ(-DipH7%c-LFC3 z+|T#v3kHs$B7MdD+($^^Gau1HeUQ?bPvW>3-l^}SacRDg)=;EQ#a?k;yNcg)W=-!P zOWT~SWeR19W1c&G6!~|ElVY5CF{agcYrKOMSSv>&PY$-VMYjBx-3ghuULLIQbFMTe z$_2;jP70W|mP%QgmYB|5`WBZiipHP4h2`{?I#beryvis%>9{?p@#ebfKv#F8!)XR% z=u8y!zF(!DMK0tYKdaD=8{dHc+3m$QzTAoc0RS9+<&OWmkm#RWopX}4?E(YB$j+5w zt8m6XmH33)$~ep%AsXqdQ>l1xyD|H6!de2xHU=|6!wF`Mxp={1T)J4<6V)We z%(Y{b2X1r=PPB!(%aj%|-(J`X)C`Rlu{h{8dyN+=QxLcX5ZwIbtUF^YWXI}t%r&g@`|26_Hk^6QE>j(sEp`#q46&x-E|NG`wc?F;6 zJz*5;Q9{9Bb&%>m_Ys(4#O&3 z!Mw}Dk8P1s%CwEyo10sj{nqBCEX9N*}PyJKTgy=3Mvh<&^@ z_n!O}+YV(?p0*W1WqOf;6_e||fI0Kz$9Ie#gEDC3KJ@fsstunG-LTZz$8tzlrkTv|ojP8>g>;%ved=a^tIT^;E0& zD=?8@!}=w~AYqx3bXP!};(m^NYrI{gTk&cj9P;p6x;jLs<@00`ww1J53Av1?SBM>>0N6sV#t(p!nB<}u5HS)`?qWox zDJHBwq{jkSF}}Tgqzr7%z2r)Gd&iu-JdF*iuBk3F`G`|{=J5;B)?s0V z6%|i zBtN=h^w20wftx=y267q-98&!RXV3m&z;4E|EC^1rh9)k{exKe6Nim&0K+9-KOxbe2 z)KSQhqi{KFauIAHytXgiLzpI}a=j5HxDS`}t4++*UTD4m?%OKi`D9zzrxkgf()MaY zRV4-)rAWrzIj%0Q*Pe`5*=mnD zS<9Z1sevWPgB-`VW=Ch1Wx{6+{<`F~i9`Fq-t+<0*QLL>US{9Ab?Ifv(uPt!K31k& z3ts=84F4lhAxO^YxcoANZ(oV*Usn(Rk;MLYMxY%#B{RT)5On1Z)uOddA+zp49T6dh zC;)|I5j?o$lCrovJlr87EWe%oc0Xt>a(8iQg*Jj1xz;rYg%!k)zWnZ?of~GYlF8~> z-^|uKUXRg#aQ2a%iaeQ1Z6@YxcCGnnw|S?jgMm0qt6mhvXEeGiFsn3*=j+j`+{}N= zAO8R?Md5E8+2^l2`5NSr;`t2c$0DnNS;XSEu|_5Tcupg*bY_!2D{km<=-8>DABA#C zT{>nMSJs&lH(58kB^{_~UyxPMtjaQ;**l83Mc|{@FM4$lxI^lx$mJt(|bj1)cA6*UT+rncM{pgvS+04wQH5uC4u)9#(Bwo?w z0(YNUM&M)Ybs;OYI-fvS!K)+?6Nj5P-!^GKa_F`WPw)v#GDL9>S>HZ>qa;-aI@h3G(U(?h}_p-eAo6p&S6%l@6b4AQLK1^jHxh#+J}V1C!kagXZf4 zK#NFDFnVc4jEO7lC!Fy{&;f&TqWC*y5LlAbr$MO(xkM>2>KJg=(8e;owkfW#?$ZQM z8VnS(gs^QECLlob>=`^IdYD}rF#e^(bsM~$yIvl1;KG*mS%K9J7tgDYg*csgJrLFc z9MjFjQY0-@lz|J>!&5RIj&YwdsNDCfGCQ2=+c>h)TC`#LoPWe5j%3(CR_YqQxTiY61g60~U+lx??C7Vr3?<+CO4Ah=_O$IxU@ugaS%0b;|75p7!0 zYjD~L?(by#!NBBwZ$o*04HsTU9%JEbJ5oJVS;!WCoH4Qtp6BK5hPsKjr_&D3q8!C z9&5j*W;To)HKTMSBR*l>&!R|OtYUhkNK=6X4Q5(76WVQak*ca|3uZboBl#PCYGQFV z&o$#c&wK%}TWR3iV5tlw(?)#L} zijpmtiq3sA=bLZ*X0WG7q3EpT5(`ECS_!v&?8C?JmKdmmQpvUlIm-LYaOJ8$govQw zm3}!bEyi!*baFN@xiSwQewqO#3pZjZp|J{kKv4DL8ns1;&IIP@NEcR(<9Sd9E=$L+ z-&;l`g|HgOunKxdx?HX;ZSgdATTZ=EDe7up&~@%9;TbRF$!5{bO2nJHS-ms3IaziN z(7;FXzRuN(catZN?-)tdTUS3UC8rxtvhp_!=$|e-({nZWrn7b%Ri%&%Ba>R8F{;j{56YR;^G16!C*s$YSj%ccs?7Ky8E7=jI@p6G>rT&QjXAq`KGTM-Q#a2gO zFr@uU5dO)P{0IE9mHHw!82)G?NJ0rfwIbizHc*miC`M6$fGiF+hL7NhS#l;(B`(!8 z_7M;`MN{1N@@)|7y2$max&i-U{NY!v)?r@jWv>UDm1;@6RA*ocV>;t-9M+Fu`MIVK45lBmp=Kp`nm2Ye z)FJZw%bf47ho0mESP7gj0j6syk)bb=%3OpQ%|)!0`LHB-51@+LIN4(-^*kd5G|m{3 zlWnNx2c@c&3x>Z5ZX0i!`+=i@A z=Q`H9Vjp%~Vn@yQ%6dxJwFcYInelWj2YfPX*Xppt?>v^Sdht&O>{Q+_y9;2khwjsL z&RlFOuwq|NJR%-Y&j{G{%4_?R3PT%dcu{XTT=HuNY!uSa(>%O2J510!)Mt1vi{n(9 z2sbt86ySd$T3ioz6$?Q_MX`I>ql)^r#J;R}+&xM}eb_6Tp$-HG`geWn^<8LP|KLi5 z!pkJDaF641sA|LXXNRRQ=fJkdOMBV7R3?Nj(g$ zZr>xG8UP%-+r+JnW~P*9K*-Fm_B9`t*deed1~w8-%S)v6S)0}B|8kLYXaIhrnVY~P z{SN)BD+R;tHH6u_p{+k)o_y6)DOv6kqVhG=P|5AVNkjK8*-f@U`}tKfH1T`FLxX0% zfh&5DbKx8A=RvB^jUd$1Y7Yg2GECGpbiTJFmZc4*%LzThMG>~s0)c6~My2-bb1i{n z>+D+R_kmK|hLQH%yX)4Q8pf173upfMUx9)R%OIDcy}C4qOW$MgMARQcYQ-&~-{>+z z@F%ZwE8Qn?uZvXas)g_VB`OvU042%%(p2l$MgN!D`WwprRZpao6HxsO2*G>axdy$_ zX!90ZlmTf05Qu|Bt+4hQ#Lh?#{t_o0mKT?yclNg|(geZYm8c0Lb!~O{rJ1IF2I^J2 zW>O185Pc(c?Mbd=WRo)RMR}IdHo&13MwY{xn4k3S3Ze@9*gzQz1+EwcuMd9NtaSGv z^MMW&zz%|d9Sl~9Jh}etbCf)imaMETm8;TW<>JQlxn0H5-G8>Bk3FsFx3A~p|FR>x zzkJSrwjpyHBV)He%qC7-a)1FP5pGO=mt~Xi*2|M(ihxsvE>0w{rxtS}}(~v4U?pPh)hW*SmCD!;+ z&fs84hfur!!exq1twfkx?HP#Ma&$oSniY>*cULoVdIuK>xZm3r{!H;Xh<8g>uDW zm93p2!<(%X5WQn#7}1+VZhRu4k`UTSnSsIQ52esayIQN-c>&NSzu6`Dn_M=rmywu`pTk+{&F4vv39|6{C`M9_=#7z{EQ78L3Lk-9}174q)=#G zDyyiNV0$YKW?o`QdGzh+GZ#c8@+ZC~3!aGXKo|J2D=)S3v?miBqFt(i7ydi~w^CP4A1wNQcAtACsGWWT7AHPQB)PvF$`#K8)Sl4OMl+K?Y znqW#Of%^--Uz;KS`!>SA*ZaQIG^Da+d%yV8&mbyRh z%_CBGBBZK*OTsCw^3xZelse{utIY;J6A-vwDE@oG_XIp`ZS7vvPIMj-^Vw=!rS1i< zrsnI5m7Pxi+$0Uipp*My-03TFUzpP3>uWZCbN6w1-2wQ!vFnb#XuaSSruJR+n#N$$ zd2(8ti!K%HoV*a;A`N3ZOyR<`m_{U^rW;En>?3}<7c06QohY8pjgHr~(opyw9<6~` z3BjuREcNc60UNkH_8nlBZf{}?=~BHlh&Dk?!6MJ@m&Kgv7y!uq=ETsP7VYVJRV)n> z*uQ9@p%v7_K$%Ni=E3R2iP_^4kTe*fEt_xR4Uo2dH@Vo!i+RXe(3l0miy{!HAl3D0 zXyRE)vnU#Auf5sciy)vt`MSnOhjS)CVPLcokf;acA^&${a(N9Iln-fNF~UB zoI*)uzyRR2dq5;sMAHni3r}2=bpc+gHV%Yj!p^04CG_Trf19@uakCCbNdi@$CXo?q zBvk`ewIBwi*=7GS`SLyHJifcrcW;mK{+v!!VUq#=;0A+k>6Ur;v0fJ#sdo}mu-{36 z-f+AmY6W&IWI7D$P{m;)eb-k$t+MQ49V`G_6r3oq`53FOmwTS7$xZ<@TR_`!j`wxh zRjg04GAT@krAacnO87Fmyu}@cmU{bkcPQm0D9n=Aa54eCE@aaUy`|dI67kN=>*EZe%=zeqUp0O)1)j>89EzT`)Vxnh z1hKe}o5{#(kRs!%!6uUaD|}0VTMiUkSL2-J-jSctwJ{RkP1M7Ube8*CMP!dxdZrvv zghhovO%teAw!2Egb4M4}MnjP3Bv0h}O`%<9VGNG_tX(ZvrXJA?=T!BS@(o8ivR+nd zb4w1ckA-|)dW{abtC>Ki=q|zzq&CHI$u$%JmX=)T{Z*( zp{*j;`4D@B1Hhy`jEj;RD5ar(QiW4rUlEe7$;1glKl53bxVnVsY_bk3v@m7thSOEM z_d?Mm#>CfFuSs*}rUEvKQ2wa-4sNg=CFOHfGGz2EQ+hSZTUjl@1!0DI;hfgyD$HBU z>v^&pyFs~^EmIk!mTslzZi;VuhI%%LH9))GR`u*nv0I`3qGR$*B{fKdS*%^&1M=Gi zjhv-(0dr;qJ)-@foSB;uJHh8$oV33)6Kl(p+`JORI=h~Q$wGdNI$hJl9_h8vnD*!A0N7 z*_hVG*2&z&{BP|T-b&hkoT%}dsnx3sZ4)-QI;a*7siyn^E4Gq96ah5AFv@0FnM^8} zkceje@k+5~pEOvB4-y+;Xv=7uOt$-&f>zgVvDD7Tk?}W2I^?ojicwPIq;BtZ1zCU;gQ1@CZ54=NvIsCt ziWCb67@6Y_r3OB0KEu9f;b=}Hsjwttc(~B{xiutB1Uq2$F(ZC+$!R}LU@+P}gYmm$ z(&us1a3w6N9i(z#VG=AQ3psjqiFu17y95X4~*Oe3l1&^d5a3>>Xn~YLT9|JE_O;rXawVC zN>;7W*8`nK49PhK)A|D-0}1&{iU=dmvefaP-0A7tco3G7e?_*Gf@s?S zdjZNzVy2uDTK^h{Pi!WKqFC|wp_gXIv=&G@2w*L^IR5cT#+rWAbQnZHilk~cc50@3 zs-rz#1Ss|WLfmN~T0_&vHpLxgCeBfjI-vh07W+m2@Lk6n9+w}*jrFn|$bX~xeWfN< z|H+OeTY&f^OmY(ZeM^cY2v&3Q)~i{*^Z)o|8S%R(Ostb#Y8D9A7=$o0AnA#ni_nv)o zX-cJs-^53{I-V}K%-OPIR+F|cvIW9tha@%M?YZc~v~zTIe#kB#fvs9Jo%fDhxzgWM z(8u%`$t7%?**Utrx}ob1Nfw^=GGP~s5HeXg5Hu^6goLrfmAQ}>3K$w_zVXGe6CN|q zgbH~^fsWmP+A3%gG18j%;P2G7#3>Zi2?As5-q#A{lP4mqD3?H7u0Ys;!x3+TL8+D+ zZOJ$27@j%_uLsr#>7G|s3?lePwRYODb+cc;@y!`wQJ?K`Hr2Wee31XdcyNT=uU=Kp zuDh#C;z+;$y{qfdK{b&wp4KGc>yi_66um8EI0erQUF|mS#PAlYp+M1t*u4YK=aV~k zGT1lCrws;1p~dIKcE)a(OPk<2ir)7WUto3!z`qT7Gjvi_aNWV4x7i`=8%1~_cW|}X ze>Ki!5l3mXhwjzzE^3KhxON_uU#$)GA(u>dR~niO!({JXCefVM`L$Jy{%7imw0&43 zeQkT9paB5<^`Ry^eM3uq(?5>(*xLMOznLCS9=yLWDO@u+FlYoyqks!Gvi~B%&O!z2^_k3dc z9*qCJ2?~cKvZK6ic|0Tp4GksK%-Hd0olb6v43S_H z3NJxdO5)B)xLjrcdP-Abb#&^<@KF^63>A%t&7WQP_mt=g;0CL{v|Wv8b}(h~bhofm zPMh_|`!&B`(KcBJRmJ-xc4A?*yFIe8OLhH`pUPn~!G4z!v@86^`vBflR0Y97|qCI{N|Y#;Dv1Pyjv^ zi1f42GQbAW9YOEbN>5?kLztw`g0sB|-Y_3XR%&BKVir0R!7>38%UdypQ|n2%~cGQq_&m>hd0IEWM| zP?JR&jn>gQZM(}*EJnHo09)Uw{Tg5<=X8~D>C^B6ix*;CmHN_zm+EFTc#2;1^jZ9V z?ZAmeRB2bDS@GrQb_u9=^9Q{rvcT?d)nlZFZcp>=5To1kU%~@%&l2l8CY(AKAmV)T z$(!VPGr!)Z{H8BG)T73!cu!UFjyt%fY85Rqw|H}_f~)TuAre0c5rzqog~xwbw3 zekt9d@A2-;08D*qL0qBmEzN8;dt_UQG_iv{2fj;%M^CNwk7kNj0MTE)pi2=(nQU z;PJx>M7>*f^?3S`ca7%LDa5yz`TjTa3(G+1bED5bz&*W(bG&o^`TW&h`hBAZ9V1$S z#X$I3DY@YuN-pbQKRYP3Lxic@k??s4Ca@Ni3}(D9cs-m4<#g8P@iOFyV|%U}NbBCGIUR(}4ug7!z%@Sjdo{r!Lpoe`ar zBb~LrU6az^>d_y%Z&po$xPmOQ$M{9^tkH~vEQEOVbkvyE3Zy40{?9vY+#_|^dcD9Z z%GusK-cMWE*|z(2X6yAegI;7q-ffhFT2-eNTegv7TSb<^DArxJDnlLZm$U5Wnv9Rzo6p~cwe!Y(C?o$}pi6xk z5S|e#OaquwXv73Onn0S8*T3Bq-jYR@7bsTR-|`xL@F5Q0V5)~tA+a&)2x}+(E|5S# zZDxqcmD7;S4!|A{1N~SWPg+8g49tM&fTx5qlhcisH4V8h>k-bo{p!mb*~nyg@kybG zKgog7q)IjJ8&M&%B%h>uDBeBHegt!4I%8Df zVS@?GfvI^z;eEn!DR_>jO$K(W4j1Ps>XD~YD2_7rOJIbrYeA>2yR_7xusI2gJ`hu9 zZgN!8Z(>eu^scM`oM%=sQ)hOeA6|MEU*}v`X@8=85`P@>t^3E!Q4fksR+z*&#g@Zf z{apU@$G;>l|17q@ZZ-IS0{edg`(FqQt4jPM@9R|fzV(RA`P5d*0aqkH*jnJA1q%Y*gl~_H_?<|Wm4c^|0ZXCJ zmFO1jw-%LtBZbQ4YxTwU#BwuO&2Sa`bA~mGym@-&su|E7d-}yPw8n zm_-guX%Rx$Hcew-!7!OkHU%mB&?5m8pt^L$8GDM6d!|9ThHT&P7+v1TxJ=J^xD04w zKn(k9r!lxAohH*_h~Kc0i@C7ehmj3}NT z3teG&9*cF}^fasv&)oqJ=itu{%z)=Cmy2Ua@~oZv4b8xH@}WbuT;XMNMZf04Wzn^C zug)DfcZiDih-5U@oMIHJA+MucwFMrV!J7YQddQDl6x+WQjE33btj2rqa2@JEECoSv zvLz0eJXyYLHCgGwnAjI#*=K1Dny!H#{dQFvIp^JpT?i!bO=QN0N2CXb>2V_8v;SvK zYJjVOYRKr=$8oGMc%6dKv1$(%vIz9PdicHDN$OHxWK+F>I+t%Cx$HM8H=tUDbckfg zCxo-Z;nB6t{smtiZ>SNC83n-7(z=bVPL4O%tHs2pVMP>@t0D$Lj#i#?-m@XfnXarp z(FgglAq8yc+#To~wKgQtay5bpw96J@$>lh?%vQvEgpCv;cT&uoQ4h zrwk}vs;~-liIBebyRbMe=F`Rk^k<;oqO8|*7`fV6Jv|1twISCU*kbnvW7Sz=EH1#7 z=Er)>={$OJtr-E?&|!+%ha$bTsWDiQdEtJg<;X28UneH(Rfb@>5;p_p(GrqO)vZgR z74pT>0h1N9?4cdIZ`1dnba1_iO5u0|(_*UCj9UHcXGN;@;!V-WfP}ZjNlSX|(WBB1 zDcS8(D}&02$Ybsc#cZNm^x|sCP4NWUXt`e}j{fbtp%Z(ss306#f zP6xMMLis#3QqvFQ+38mUddn z>2fL4k^}{J<~?(V?CrXqVx||}n@wc0z9pZx)qZ7-NQ~bJLd>%eRxkjR0oc=@ortuI zFuC)}2id+(GZYDjDX$kIBb4mywGNlx{hfxODYX*3c!erJV!o^|ss=o7_tkpEKH+q} zKLb_=yx==K6c?@sfZZA=yXxj72xUps4-jhC5^2i8tIG?N<#y%xRFT95_xR#`U+`;k zt)N6_BDST85ogpIUqQ_9U;RFI5PaMGBl{uUmRJCTC zmz_T&WQkSZVLp*nXLs8~oMWs71##_2g@@$mS_tN)SPFu@`7p%Id;9N~!kjZ6=LmZv zlI1{0?og2$6PGV-jHoxb@`d4hb}{=UCQi@+J!oDE_-14%@Fn}6Nc%vAjLMao*^@DI ziwa832zuFpbmB8nj*2hb3;gGKtKd2A#WoHs8mOxo=2&H$PITD)T!CM|H58KVxQyJ6 zBy5P)(wko@l4W!^Yb(4(SMWO*Z|BDbBeB5BG3y*5-$R!|P*38@21(Z2u87dwLxrb^ z)Wof`>hy!-37?0pk}Q;8N!kemi~X{|sRU%>qZz}(&Qg~IDNq`c3wo#7{AA*zkcW1H z;x71p*3o?ck}^d@_^e_esIwI{DbEetE4#9t3WH5{j9>|*;irgy%9ef~NEfvC}GaFC! zMBOlrejAUp#wJDvqwTvv?A z*P5O{?wJEEK!gpG=9Xo(`=0a9^9qa(ZdcXSV<~ z0svC*qIm!5=eX0%N%AQi=!;@7YySB=0R5QX9XLrHM=PY2?~@a%xdxFnHvA`WFfKE# zsnZH#Q%y6BO>l+sCSE}E`2WY=J9dczC0U|r-L!4nwr%64ZQHh;dDFOQ+qP}n&YPO7 zs;PcmHPh8^^_wqmP5*d$dwhMuH&eO@^xNv#?M{`b0_v+424NaGAI7b$rki%(mtpe|8s^Z0MqQ7VkZK zVIKcCPZD zCfcIChKrxD1^Z?1$aL?0(qixQQlV@scj$@?qP4tq6YRIw+&Vig;F!y%pyc)o6smIq z^P7}eD^!nYD@@mTOMvG{(}C#JF^(|Rv27$^{?@Qd-lyizJ&E+OYgQ2E`q7n_gUxK7 zZjt&Y$IoZ4$FfKC_=VOYY{1nz$5tDo=RB$XrX3tj3EY7>%!%l9t{jr z(7Gj)3>#1=G&oV>b3|MVcv5zaA)zw!@}EZ2VaZeL1UP@1ijP80V_H%*Jza5r?zxA-Xc0)2)> z=?a{9NzkOWn=07x2_aHKQGsZ5ypnE!wu%Uj>5gykzaLd25661O@pQX_nk8wJV6V5u zT%M24E}FMI#kR1>$i=BamW9wavmSpw<|m=ZPVE%DlZ!N|uJxo^P8krfzH=X9)LrQ1 zseoB8Sc0uxKent};a$E~ROZMWyw8x}c|=xWRL&)Fv4xi%Z!V(ek_9cKE0pZ=OdpT( zjrm6oz3f?d@cf`N6?%~{4^wF}5uE_VY!4RGSJiX)?v0U8lkTZt7ydo=V{&&hx@gGi z6hJ*g)84XjNt@`LmtiIy4Xlt6zJz+(l1m33Q6vJJ{P-mjL%lY796Isl=$(nf`3T*O zk(GPg9@sc9T2fH;0PF}`gf{2^l70hpGF4=ZnHmZMNkwlk-UoTKK{a+!wR=nlGUf&n zE=!+ULi~?Ff?f_L{n$`wKtA!&5|o#AxLdHlv=Y6CWngLRY=A9&evQ6)ufD$XP3Kv( z9_@lGMv$7JWm*4qhIxvB_LYiqK2T}uIb)8x{qt4t{MItb;UITxV-I@>;z9;czhW9y zvO`pwtKJ}k3TCiD@uH#4q~l*enq~>|w9Ww#DG{@_I4dIRm}ULdG-cPL(azV`*5R!j zq-NN8f5A-`vV~<#nI=`+GZx6r7Eg+ILQqv4#2&7|Lb+njYX?0GnQ9d9&fr{*((Cr9 z`&QJc%WYD~jC|dhCr`_p=V9zQ0T7Wz3$pdXiR!mr?UpMy-;8UCbr={fLJOop@g~n* z1J_$8mEl1Enqg2Xl!BA0;QW5-x}#z*X2uY29rjyTz%WoJXq!@z zc>s0}4*#YM-@RIMS1Aj>UH}_tRiNTTkL)Z<(tQ<)g}8;`GbT~yA1M)hEmz9vR|^A# zaK7Bs@;H6k@?;i$xtjfsJf^q(@SIQT%O6yH(b|uW?_{*qz4kbZ94;_0&OIu~o*`$) zux=Umq75~0b~NNL>SLU0wmOb89?N7h6p+wzK`!ZXq=ags+tR zaw0jYCmaxmN)#_$#4CO`+$eJoi1GFAW1b0MK-#-EAsdDC)iTovFokFO-aUC@X}F2& zLgq!`P3~jX&rN_GTvhx5e z`_2qv-F6Z5+H~p@)(JZ8OWaCW#G0110v79Tka%v$wL}Jq(n!mxdZNH#*A~!!!)Pe1 zEFWYDVS@2Ih_`e+Wyil@bORJuNB6~gmm#R?B%P{dFV!6OK9uDItyY43ODg5=*Oani zA$Rw6N_|)|J1r0AuWSP_Y7iT;fybU^a$6U+pw-KRm;l2Pj`2tB%SS3IrC5$Cx?Y!|A~o4~B*iYd>=Y&8|Wiw{>ao;VCM3hu0)7w@|D3 zPHVQc?0w7A)OnI0mt|ieFPtxSU!@gG?&Z=HySx#@<;g^d-;}?InPtCX-6mAIeR3g_ zV=AKkEnD4EM=~87yYW`cUJ3d8|aTqEr()I zu!T(81k}67ESf=F7SlY{8Oe|e$C-nhG-6%m8sV}sIy=!juz%_^{nC97B?vxBC@%Tp zXlz`UB653t|H&ZJ`T0_P=hYTVvWBF=H5S)0&Y;Ce@ODMNmJ;|hcbVK5%tJ(j*nuM9 z%d*)XJ~xBrB#e8oF6uL7=uxs$yWe?w-P-*F-0g;P(A9IxHh+&w`+Ym^R%hjfmGdly znQWXV_v0I)HG%mL>a6AIrmYpGYrP?V}Y?P`CbdOPFqB%pKO3 zZRjk;umVij%SLvl#f~0iA4&&7yer4{w!}KKa3rD-rlcEt^>!4l_**QwWElmYvCf%4 zeZ3ny>wpYq+fR=r(i=+u2RXRc9bL9y=a{|?D$t%CGBA?<9bQ=931b)62Rza4Jyro< zR6i{y?9Arbb%Bij%;8i{X2_bzL|@8ddV+9 z3bJeJ4~|ORI4>L>P-<@9P-0smDyA+-AGm&?Wd&p6Y2LW+BepnjmOMBMaq32YI_KWM zdt8K>9JHg$#8GF(74uaThZ!*bLb&JCYXABt$@AWKgGBpxfwt;fbtm^P*~vdAoByJ9 z{`;t>|7H5fzonfOwQK|Ekw59YuZT@Fnnvc$rQ*;Hvqm@SF8n#1$OHEGtXF-v&8d*% zLOZ{Oh8tauuO3~ayyErr;iEe#3C8H4M*OG}S>VI(U|$-wFmqdCbkh(d8j6LHI}8#I z&}9!%&_5-rO;72h&{UDTv>3%Qgb_@dtM2rh*dz^n%X`ReJ~nBi)JhS04EODO9j*Ot z<75Fyoj~aGVF8vYC1JCHCmOAz{Fw~_Fbc3?AP!Q@@L!QO^?E`iI1G%LDLspCK{X?w zuGP`%%kmi|V!KQL>N6%Alvl0b+;kVXQPe$tog(X%Sr2JVxus7eG1(UvE2;$I`jym5 zQd(BvY?^?t9Q7!Xh9Wm{&`yx-dx>|)LFRw~0EXQ2zMan`Os1V*sXPQ5q4m(1?uiNL z7MAJ)b2(pWR4TCuC4z8F;#j7Njwb$UxngM8bB3SutzuJON*`_epe?-1N+(^gTYe;T zdwq)V55!uqSihMwD6IvH&m{x2L*$HXnd)1v=oGR@{<8I^|1dp1((4CLS)#B^x+Sr- zl=W`qq)aTq8xewz0jFA`my3B+c37Ta->g3$_Ry1Rtr5Dr|M8DSiGOb=|2mELSNZaP z+s6Mzw&DAZRzUV0;jo|s0Lc8G^C5qWdpgxU)z*g)zbLW3>NHC!xWY`0&T>N zlMs_lwmxiB6*bbtHB`C4O?9Q)tyAU1a47J z3fnG38s`m~cEWs>tI&@17M+3ekf<3`Z%O?2FI+3%I`Qr7)ieA0&4_Dq>J$c1G{M+| zYm;lf_(pMp!p$~OGx6$>j_SDbNd6wRdmM+07ef&p6QCq17Z@f=CV;D$5!y>&JWlT> zb-KO-n$-aTEJ^`v@UzbT!%>`%5QwX;5KL5_a%fmNc)D)~$ymWo+8h&zvmH8+!*3G9 z29=sU(Aj87!7j#N*p&H4iGcJehZ#RyAX`#bZNju!QZQi2L&g5lGX0C6XG=VRVD?+N zmtxJ1yYT5fgv-S``HFugPKSZrK8b`0IyI%dSg)8Q-x|s%W+1_I{?4GK-Js=$*E8lM zXHz${<)of)U|t1ur`d)#mUA6?JdH{C1oaA_>1B{fGZyR16laH@FsGM%js*|oFFF3k za24x0y$ZFV_;XE~uiP-XG$b1onEcAhlGd6B?i$ zM%l2|puJ|w_J$6+bzn0XG=ytU0^<=(N;zD)!!Z=eIyd-MHWNqn;cHk*UE3@0>jrFX z%~@b&SF)Hey%2&^sm>12nX;9?C(3xsOWW(ai>tE27gDh}Hu70bLkd?#R-UJ{uvwn< zzD^gADqoA5j(#C)%%3gSD3yCU&8i%%Tp#$JPuO8+E}f+eBMF7k^RYtIim(B>ST#6G ziPO#()?(Bj_|rcBo_hDJimYK$%jCiAKYwH|Td;#0)sX570WY(Bc4#c!7#A&=BDBrs zpkvhGI@)#_G@JUle9h2*+%)q-4VS~+NXkP-HJ@#IAV20# zIx-5$)O`Gv{odkjFxni81R!bpn_P^TJICtUrar2gdg>;>g?!G7LQ1Bq2T=bh-IRO0 zn7a!K)AV|Pjw;W|3C7OON6e&XV$?7V?cGXVGs4=RnBImPS8eBy3&jXpD6-qgv)$SN z1?aNDdapBJF6T8!tg{D=I!iXl=CGI|3kvAhss3qclL)E93?hj(@?L#>e87gokfDHV zDrPZ7<1hp{VT7=I^t0-q3W05eU&~;x|Kb=0522M+)0BU;Xrb?9eKIM9@pGNVjcFrY&D?}%}y2xcV;rrsay-9pjciZih7qmzWuXhCGTO-hj~wJ<|W zj3_^Rvd0q4B-q2%B*!=SIb!2ZD;1*8-TWW;n)Bb77d5g8EActWU&f9t22?p)V*WZXH@FcbqcP=#|l6C6`+Kr5jv!MHh4IQ!QnP zDXs3_)5>@Kr&bn_RAdfy++wcY@xJi|&$e>d4D@*LD z?dQ-N?afyiK}+qaJ=emUrWJ)BI>U zBGBEaS3xigiNiJ_)%qoQPoeB;L26a1fDUZcDR|l+SsM_KQZ`Qo>g(v}wxgV+)pUo|GyN$mN3|xoW@Bw@+DK9YEfyMrm9ewY z5e@Hes3ksdDjj}6e$qo;-?QwK1SgVf1RAYsZfw!XH2HJ=Yjmz`8ou=8qcoC{HT>!~ zn01}a&n;k|AYWYk1Tc>bN@*vw%fkt8UJVt0$7O6p{F%*$LT@eCb1XN`o{3#b+&x!w zu;pJf2cDPBW>G2j$YvutwQZw(-Rf~^+OROq%=ien_;7m0`bV}Z-MFeC^`?V*xH@KYypKQ%U{AS-8z7PW=K8L5`t2EusA^)< z-hORe&l|dG>=$RdWQ?Mp&OiI~FE5E6XqHtheo}obRC7HM|`Y!;LX^A?c#G*lY|x{ zcTL(pdSFrMAk+oqM_+=nZ_c@YYpopEiIVdpZ_*6-0>DS^s8ut*MDHg(i7PseKlx5X zNhpb9z0QxjMaKxBaVo#1*Mk78+1raJ27c!)C|s;ogbF8<2E2F0)3*E_zWH$;Rk18M`7OjQD$5^2Y!>{xF$QfsrCEHImMRQ`R`f-b9il=rn*&EM{n7uIB}* zs}u$uq#VC>HLAS^X+3CqILWqnGExBqnSEZgriSVkkx^4)nLQF6!dI-Q(-%H#M_Z(D z%8dsFqd`glb?+_-mU*x#AuFMPMp#^Fi(PEU#wat10VtVGD>otd%>?2Nm6FY1lh!D- zyqvLyzu9E;LfpMXII>rufpL>Ub01HzG?|0!QtM3GW{_$4p;7J-D*s@%^&qD|2#IDM zAj332pN@RP_B#ScCvK{#7#Bfm`ar}=dCN!7S~$s)<)iF43tRmocVM(S+%GGN!^5IXCx8XW(mllr){5`~ zYLLtQc z4GJ=qYq#SHH&OAe$1z8Id+O=8UUFFNAev=)xFp`)gL$(l_=@|sF5q+f($+2zG!3ri zz#6T^uc0TL6+ShpcyS08V!3GD%{H=Vt4geUZyqn+_M83#=N~mNm{koXqcSVsn9=HY zh^Bfo;O)JpQ(%d5dJ>D1V}X0-1_=s~9`$;#WI`UCX1N=1HnIb6f=(vNp9@&4aplvP zqe;6|p%^jNqv4ZD*WTdB0{#Z#o-`{JG$V75ovOU#rkZ zhu-)BZG#R9zLA~;ai_T#iz@(~r2zK=anwJn37B&T;&*?|a+Z-{w;t|Bf+1Um+{wh# znQ(|5wn*;R4jETFM*;GMVjINwX2ilA|$^gJQXKeol%b5`@Ql_oo8IQ%dqpeYs=x zD5zOjNQ?;`^#R+PD<A_ftmcvhT`J-mt&$Y|1s2c}E_$dB|+!9SpxqPFBTVCX@3A*J`AoUyXoT!C^l zA0Y9?PrH-wQ&voFI=>xw8sV;YCc20YMEhaA0O17f4atU(|;( zJF5()r}{BU&7xKr8Asfi{Z|5L#NW=mWk5Oj>zYe~Dj!Ch~&$q{dFg_Tq zHouVmkr80qST*B*i)vTDMYaFm^PK-SQtC$3>M-zfc(s-ZCBG!;>nN`Lgdw{_G8!Us}~Yj35_BV+7LBGFS&YQ=)t-X z*HQateI?Y;2MP*sxj-F~!qN!uR%u?e!5IF@F2w$71NxhdYRc4~DZCyN3aA>Q7hAes z15Yv$UbRiV4cc_9nasMgvVOQZzu*;4fK7;pd(<)c#~Xo`#wxGlKvS9uQ>mmMw49j}!fN;23n^?aJhz2s=|3Q{ zh@%I|p01Wu-J{rzUWw8X4J}sjK3#trX8KHaEyi>K?=9ukr+pe)#nU9{atm{j_KzY<}Gft{7ZDzMHlP|4(FV|IHNt7AGxgSUb-DMWy2SSyLrIuJw0bB^ts#h1jpN(_gi8>U(P89S1}Ieij`nV|H)Ze*ZMQ5A1t?VBU4;bO+Hk z-<{w#T*vFk^D)uK``ojxM|c0wH4&X3OfJmc48c*?G>#%@VHt69fm6kEI04q{F4y(S z^S0Zx_t)#q3}2cbwAg1aAUF7Q$8*;guEZB+*KOcnSSiGKJHW<|1d4?c4M@T3nP<4i zc`V_oOVEtW0l*P(!w*t&1X!;xem(>k@!LUhyq8`j`CT_|r|*M3o6*8I&Pl$6ic-Xw z07dO{1E>HY3gyrAzK&%2gVh6|F?5NHvH84+{WiKu62FSUK0QI<$Abg3VW3Thv@A4Z zAzpE5SS*GSwNQqHi^zryp3VPyo<<_R38b)j` z0RYSP96*R(`(~Qqb_bH|P{Z&TdH1bvS3p7(_Tcw*&RI!BQADR?`5Dch8r%rD;YR0| zq`mV6Umri)90kJBF%`&G3)!ka{mzTf)I3B|!!l~Ug0uPPp04`#si^Dwc&(D0VqZb^ zS6_wo6AXMVYM4!J=S=e6q%;m;ya4T(@sdQ9pn&nPi%MoVVoy*HtHPT%`rk4__5_uH zwZ3BrC@?ROB`@YC1(U46a`j;}9=^u9eW0M~>XaJIv&FIr25lYIZJvNcy!1F&?HA5f z9`()n@;7-7J(l@$b}LHbzR9(G-2Hy&ThTUrg0FVT$6GjlO4ArC^E%d`lP=~}V@^5a ztK6SwSfE?@hF)4FpYEAnK0+2Pr>+=(CebSdhwriylcsIS=N~g>*Q{aLR%t%H3&5HI z!||&%xlj$fa8=fnodclV62|U1XosXnTH##1KyiR2n)ch z|2tuT;y@DM(DAs|oMT+(r}hL;V^y1tRn{dwfUVq*#9OR{K*Eh?m12bS>%@>4B0lF< zyvCG_PB$ncYvM71jv3N$&GN-D^wp}I!`POg4lmMej5Hv;l^Tk{IFV{-p2|d6?_6D! zAyPn7CBWXKCT-9_1dLI}7=+ZIPEV1cYmadk2_n3n+H~i_|8RQ=E)(cdeZHHOt8lhz zbwj5Z&AdtW`_NC%pu5I@j`hx_Cew3m?Dx}g0{~Gd8&IyU_7sBgV}!0y_f+j+O;nwAX&~PrEp@TgAM~a% zn^Z+_sf**zqxSCDFJ80pyDBuK$hI0w+Zpl#q|m*`esx_(vdH<^BL#6EUZU+LfsAH* zK}KGMI1LYbl{7(K&%)0yqQuvbvC!kTJVAOean3V_8UqTFAVgUaC*Tw9*^a(@Y#!}) zrdA9PAe3efH9=f%9bos}9HrvTZ7)^`+XZw&)6V-ALwOn{7~MJBk#NTmQmi7-YY zxkDkzuVodw6$g#ka(aZX!gPc!!dJjh1^>de3Ta9; z56(qfKQu$Ws>aV2wGBz>WFw=&f45dTH8i_UHtXWt0$5_?m-HaeUUC7xuRvCz!6q}C zehPhOir|Wa8A+k5l6!4_i`klKW}3$~0N$aPY9-Rsq{3v}rWiO*`%v3gdPmV67R+&zn`n@w zxE)DXzEog zX?kQlF015GiuH9mvSw=+;n&c|gko@|tyzRCX23!CvSQ36E8Yc5X<(fQ{VHNB*8MIS0b<;9wb&g!=EX8_C2A(guKxrsf<0 z9Y-P)Z95rO0+t78Es^d#4h1h-{B!*nQ$N}AW@Bi&bePF!Q$PJeD#vy381Kd zU8t*Nt%a2e69o%C-c;glpNn8K(U z;Sm~EMp~x_;<%)YckJeRG@$$Lu2Ta0H6j8Mbdqt?H#q4h zgCv`!d0y~TfjicJvulwmaZlRK99H)*%4d5?3T<28e|}M%GDK8zeVwOwLw+Ki!clh7 z?BjBUj;3n9q|WkdgfXQ}jl*19vegIZ#{KA-D6i|VR3ZmdXc0pn&W}3!s5{bIa$-3R zEnD((j+}fX(}D+Mp}>(5NLp@niIASQb3mXTtrNk3D2#?hnYu~g$8|oB6s54;*qNW~ z`9+r~*hf7H#X*NfdB*`!qDPUYRqrMH45##Kt|Dhv23+(9gRZ<>#Ti_6`Zi#}+6Yos zV|D4LzCR$KzOYfovgK?|&$b@<$gNW^lu)!eeP~s5*dyD=` z`SgjfoS|T(@A<%J>>WT-NtL*5xTxT{0X|k&502thZ6A%kXNvy7kC*6qGK+y<7$pqTQ~U{lE1w;6W&MXrO008fM|KfkGg7Lp$=6}_XJ9@DT$?j~*6jhDchQm`6GzIRbI(v<( zUg8hss*4K~*>!|}z42@^C5ZAnbbV9vV+VicGoRw^b}=vO3gzMgX7dZ4XUt}W3QW&v zdKrgD5?i`DClndwrPo5NpF$<$)XHtO&v~<_7kj#55G7xRUx`$Ibl?m)nA^GVk>Vwqb&1z&d%;8rAD`VTo_2HttrxUR&b6-i!v=Sx zyKksIVE?(gP=n|mb^EJrk^K3v81UV2o!u@ZV6AUB#_ zjd7wN8A_7Lb3IkJgmbvS09c)Mdy-m3YtRCA(JVA}R5-YHA}MX?RDH-K6GG6anNfM~ z@$gh)JFdP}_OLGwLcc@QcRGm9WvR21XvK#xDIA?D??~ZSc{n;BL^?MFRX|IQ$gcDR zekE;hVU2oz528C%I;jE#QaCwUJgNgpfqD!AVzW8v&V_7mwGyeC!6A6hr$REwv$;uPv)KJgTbHqO6 z4WTU;-}K~3sY7!_dP<7wkV)kymgf=EU+9T@&lWmB6Fj@qFPeVt$&AIA%D#4wR(TD_ z`LJIvoIhjqT|3Eos<;6NBpWl*-iDXD0P!(6gVjTW{nn*5Mb^#Y3*Jux$<%L0AT;Yy zKy8x57>}sETaSy^1o*EGtU0nHl4^TpUV$j4jYQwU*OAV|-xp;do@5o;-)SVwItj?+ zjfe_|ElAZA#%gIW2({0!M=g{B_g49J6WGf8D4EBA`iNtgtqQ|)2zO!|?;b-ZyWi3! z(L=(>XM+T!l*M1oT0IMt4h}&C*hyBT?=6Z2L8D0_^4M|5Z)BMgvc|{>aG zgd3JniE+#EM>DH%$5aey6`%~V6`kYUY5UU=LdSqLS}PC~3}7%MWlp;d3)N|%cH=*+ zL=zHJprIZ!XqLJ|Y!@%l+eN{k)4?fHYWRXkv%ssUh^01Z+7#&|iznK7)H$2p-b-z; z)0A7i6ld`zftqI3?yO=DXv(APh4DZwD>HFgRvp|2f{LmL_*2!w)rdtFOBUh7J_`4+&kD%-kD?FbcnM@!SHx|L$ ztTrIdy(zd;2;0v_O|vpgwt?ar7YJ5L-G0-PgbzD8LJg|bCYXpL&aUsKD{YO;F9)|U z`pnXGa)rbIt+3QD%wCjAgAJt2^TuL&CIm@c7mhZR$uH?G#n=2dsAE;g1BUI(eo|NWJiw*ekx(6DMq#CSIn+OS$lAZ(L8NG z*=aSjC2+BvXikmOaNAc8bb_@pF?L#b0+plmlqHYrQ=O&S&BJ7y#ijigVQ=0h$Q z{^%m}X*@e%%q;5=5mZbSSK~%DFOp(rhK%Y_buIvY3>g^V66$Qb&I4Bm9mCzKXe6x; zVj=^tuVfeQP_^e14HxVtB%jY=GCrA+(af%6^s9>-Ky^CVEnBtnemQlG5Nz(tkTw{j zRI`YGzg)-sD?5p^NGEv&0H@{L1zL3ShxD7v#oa<)WsOq@^SoSic|bSeSkgz0PKJ4Z z)GvEeUUInPLV_G>yT5D;My9Vgcb{e=z zA%jH2>0tjRC+S)QX7UoqVu^#}%2-6~?y=|_Id@B{=SU*dI(vQ016IcUod&rOL+-XeY~D!$49L<@Py~vTq(*G>kAeIc5}Q{W#>%~MmRMSm2=3%~ zh@=;69}9JGE6e1O*JsTkg~U2VjuX9R>1%+efr_uuYr7X$6NdNH6PjoKy<~zVR2{4Yx5q08u`A8sI0S#r85^6=DJj?} z8_C2}Es`D>S_7Xbt`risZj6{f;pe{w!^&$qkI*z?4_3hDoG0T$&gR@0%{r@|D>wyF z8K5bX-}Dwgo!k*Q>cJ{TBk}UR=afgNSzS?WOkTVvfr!E(Mh#rHd_$J=02?>$BpMdh z&Iu$&yvgIlLm8Vt*vD%6!I4;P^K*#L`S%XLBPXeu*5i@e_Ha?6UluaUV~Aoy;Eo0A z>#_smc$Qth(eJ0oqT#&&3D{5Fin#3lY%WN)&4}ahGRm3E->SV^ z9((FaQ6z({-{geOsS@UyT3kT6lfS-TJjS$iIrP2qIOv+6<9d&JX)Q{gOSYmDu6DEA z;^V;}#q+rgy`{iB0IhdQui>_hg>Fk+Aj|oiovb@RZ9gcNA9kP?=0G5VkbSk(M5FNW zA#YFVuWukQd~gep>3glSCBIKF%WKa~y=VpwNnTn*TuEd@HF5vZALZHEYvPXH^VqCa zSEQn{Kv;_5UYL>C@c=Lw#3&B$XrneY-Ljgz7jD}+2nRn6p=+3h%2ft?wS4L~opeu* z-@qnX^B`0=9~Y`@tp=@bG{FcxFiJ`R^&olQSSjiD_ub}sl=b#K@Kp2pa`ro)ZFRkT z^VtFI@axHr(a=KI9pSf)~_V z@gu|7wZ{`X&>@WH&u8%Jew6s1>+f*!jpOExmj~t(RU2Tz7vWuUT{_S)7mTj$dO~MM zg6{?SCAXV{FVFfT9?cmL&F?&W8WE|u+T(%a#1m?{P}Tq*{0qO=Hbm9v#F56lztnS7 z3fT4l?(+hN>9VIC`04!l{a~maa39OZPC81>3nwF5R-%zg@y^}0FMz`2Dn})t7Sa6K zOQsI3u#4~gms<_b!MqOoB7_@s3hn?1cwWc=8({_k2Eog~!?4vGl3+*{;*=rARYk^q z722O&G(#jk#Al3O&_hB$G494V!d*u#Bq2j~IyXZe)t#xjb%k}dBJfc=kt})Kz(NKm z%eqgx=mtw#uwHwQ^=eMfh|yI`m#@pnJ~XD?9Yo~*GEJv0Au}pZvgr zy7+W-#cJxnt0VZ5ZMx-i6)S2FRH?pwk^9F=UHr1wYS4E_0?l_vg80AG?)>jM68_g! zGJh}8O)AP*_VFXX(|K;42}u6tn5)#C=ed^$XvC_bKQAXe%mRhVHs%)xnq*DU84c zEye$RGLtw|Z^ReUPv=Vyl1<&?lcND0J923}Z71*O;5uE0YzgzDZ3;3f9 zY90C*t9S?VETzoRUElkRGs8oy3f8}-IC<3f;h@ihi4h<`O8PK`UQ4C_CW0ZkU-CV9 zlwlwn6Zl7Yg{lMjFHh&G25jCVvhpiX>aLGET}XQq!#url_a){?$@X;inbp#SkpbN|bi{<})+zhC$NKd);52zUAX z{fF700RTk*%s0h~uP zu8)_f6z6abe1DsYOQK$j@K0FU$##g7ZmO%UmT0L{x1Fc zTIyTLRRq_4*pfyN6`WI|;59apFJH+pzmuIkgTFATaFQQ*-8f<`3G42Q-zF>d9!8`V zDgW3IfzCnTMPkj4Lf0a`7Rxs6>zXmYT_d>G*6OTiUcz&YlDj2zd2Ysn6b|qQOAa|RbA8VakxB{e%3<)qNPK66k=cvkWsvmOU)t{Ti$P7V~Ob5w7dlh`+ zR0FhTe;^AO;6#gaAer}40Y(Z=y93IZp%6zXbI5^qbho#4kPkp1Xv3#gxt)ptc&R^R z0R$HCoZRP>vI zusUV3Jgog0 z_S8v8u%U_{0q2R42PAle!=yPSx`#F|65LKdY z7Ycba4#e+tuK`|c4gwn~P3Ex3%thkn&_k}g z`l!+q;$_Imn|@Q9(ZiwejQ;AXiUhh2Ky?QogiZ$u?Mp7dfCAfE@d}Y z#W`r6ZM2d<4-H{SAt>MBfCGdxT+LrXn@Or)$|irZC9WKF9ZlL@jInvG5u}!@>lJ&( zB39q?je0l(_Q@`%TV>1m8>Vi=`l> zZ}WAdyL(#%`6Tw#gI!Me%{W{@b-4 ze3$V#|D|jFkAd^w+^NGl>$f|_>0G&$SIq2?XhKSRBDSgcxmRdjautP-h>V~F0PN?$ zjQi#33K*A9Y)Wdo7$^?p$>C||GCJI=iB8psDgBcqP*Bx?9>YkJ<8~4z`ehB`Jj8$| z3Cp`S&`8hOkWn8z(HE>>b|u3~dvx%{9o!WB%LSJrom?ztKQWODl3O_6gss=hE!z-ZLtLNK&fb&5i$$7hD~Nrc%emyB zY-y<15L3^4V}a2B)N%o*-1wai8o`9G;iIIu` zO%+qW-3;4+Uj4odVTU<5?ksYo4c%|Ok6c(At23pQzF^50+Xfb1MpKqI2vm2*T${^! zp>qz7(%;R|hqs7b&h;$Z%mOZ6Uqq#GXVn{o&N>nw|GZ|np$~s8YhnZ;8n=+DH<=LC zv^BA5MZEDLa@O)7(VMy;a~kb;l)kFWp;2^(y#on#kquIFkory&9#XcTB$TE@Bl0V` zg}B!}ltXD&N+EMG&qtz{xYDs5*ziDjETg{-QQn~Fs);@m5!&7(NQ`dJDn~`*#I>?3 z*Cmqsra3iQu=1R~l3-qZWvAgv$qJdI7 zI@VAA0(mVQKN@GHJP;HSyDfcOp^4El)FEqrG#|1ZA&6FfYO3GzbfAC~9R6WA8V=iQ zyh_S;x)$NbHH!}&Bu-r-Ub&+{6uWHFEU_@*OW^?}g}qZul0*xsa?11wUiz~I$M@SIefNSi2ZkIbS(F=Ww1MOjD;^RVz?vwxcxra($}XH293*%& z7&oHL!t*J7*j(v`D#^u0q5cod&f+}iQlqfD>Cj+5{0v<7hLD{R} zzUZ%RN#pH(< z7Y&MTu`SM5x844if5`k^%kPIWapl9^gVVxT=9dU z^v|gT48!i)10<>KBDZNi;v5V^^MtwwN|`G3pZi~0A!>{{B+qD3m9#SNB3 z8W9RBB?lQrXN)piOi!Q72XNZ@$hm2+$ykhE7iwdX&pxMU4sV%xc>75%UJP!3{%P$J zN@ITU(zlCr{EjI3{-vw@4_WA6w#ofHh)kB1ks6@?4kEALt#0=hvPkoa?KPl&KH=k9 zRFceCFOkv)yli{R2rLx{!P+u1T~DHAhm!oES8^VII4bd{JnPR2nRaRnii=n#6fua{ zH9QR!dqwD{i&f@PP)NGln@dgfrT7XW`7^=nI((6IyOJ&IgBy$hBB{4q0rV8TrZ-!) z!Tet39|PATz>!wi3aZJPZ;wo2kuK(4DN>2&&@?zzwH5MQXJ3CL53}Hoq}5Xgob}?8 zxT<)S^E;CCXU0q8Xg2RL=`-3M`Cdx|o1!iThrl-9KZa%h{>uLIWfy;M{df4k?V5b- zZg`8oyPhGi{jhNvLb5msVVX z;zNkSK?n@`1sLY}gV_2I*_|wGQ zsc#~`#-DWa5txN}>A>C*r*7J~BSoL5McX(1zl0f13P)v1`Y1*AEoVknkSTWU$4u&p zvHE`t?3RG@4L>}zh@IX_*a@79z$5?G2n!V6e4UdxVvG3 z=So5A2p1e1+<>CL^J7RnW(;@DFnd&yYzCK>0;%wW6Evoyf@K37MfnJR-as4zZrrOk zU~v<7TKm*(M)M;NC-%hXF4pl`KcVb-|s7~|l)_U#9Ym&&Aq@_`6lE%G_ z3Y2(`y-x^!5z*c75i`F_#+o*jz%zX8r)YPf_>M)ohEwdaTk=Cx(|ugJZ|O!oZ4|WK zLC{nF{LZnn6g}ckB6^~RJ+e#PH$cenR}E1!;F*^_GLz)vk~plXo2VD*!F3yna#c+W zgJ>&t4ft-b(;GtR)Cqd0@z4&x+Ymh{$bjr3Txvu1Ak+pl`k3@gVQ|X`BvDs39W|q~ zG(<8R6v^@;xotj5lu`Rw8Toq%4t`%Ss&F>>=XkD_zpcLZsT1;#zP!vMBLS=PyS=M7 z_UxIx9?JqkqK5u^(s}T7dwD<{;@z^#1dL?L4m81MdCYX@zQt*-(waNY?n!5^ZS+zE zk}WKNQ?$~()=3yfh{+g87;b!1_JNZ6t41eK|6~|u;IHbF&d^JvjTOoqUImk$I$j+U zjB8)F_VJmhaRhIS9+wEk!sUGFa__SHi`A4!Zla!&F<&$PeS&eb3PKDyV)xtgh~oqH znGp&yGc$zlE{~P(?XNV_Z9W`8c}7XMIg(wKKi@5%*v<;V$?FWe|K2%kM`oXr`lp~0Si6kU8WXnpW8gTaBg+t z=;8_Jn(>j{)BB$^@~5E7e!azO=*=l&sZ)*lnj8cp)w+ut%MMG+x(OVm=`$kiq!KXr z4wjOEPXvQ2-+USnno7fx0=E_$bL?V_y~L}p0#+lsRrIMEmzx`y(JPT&kTbEsQoe^f@t>r9SXuY zkBYQ0u@T1c54MrsYXOTN`UDxZ3-5is{R$=?vimhL5+X3 zOFnyz_kbtJiBlV%AeXrb$R_clHvod+Fa{P+OjLj12}0%{Ku5sJeW(=bY^LuJHmR-{ zi<068)+&8KoFgS4Mx~Ragh;Pb2DhAGiPdg-M3Y?+fD!&mx^+Ih@!KhYC4UBOZB!+Z^ zm@u0$sS-E|#V^Omd>S7EyaB76mvK>R7tI7V&D?f)8ZM1~fUl3t(b~L2 zbf_z5ynd%e=L(^s%S$dKOHCnurHSIDM#ZP8SRokXVg@WZ+~loY!6!DA3=viBk$CSL>x&tH=z;hTU{<;mLya1ZXEjxaO`(bFO+_ z#=pD+L%g2Hve=FrD8(CO2#=*u>IuN*Nkc2=OnG-U4E04LZ>ZyYtarlAcd7^Tdfob> zP?>XIfB6?ndA2e`^bAmDgH;C3#pQ-*Xq_-bY#Hu%yf_znq>eW!#;5>GOHAZb>O^t& zs7D)nR>Yu+lPrfz(3l1?siv$C!JFZrbk)1DoQLg%pH3;<^5KYXA+Z2kjtRleb7tmg?Mvd6CJ_gHlTxUGOukG=-PU4 zAH!XwucgX^5t&Ez&K@UGAhoEZQVmNL@yYimvmwu+G;NZ3h$}N#cb^?0^+W~ZRfB@m z1_wA|o?d@RKQoQ#jr&jzbG3kQBBv?ei;jP97)rlM|MkDloW(+_w`Qm%&A8&}^R}G8 z)sguTVl>AX%51^*zrS3|NIc()J~A-AIK%0NK_#~(@)!Gz?@N<#+z@fjRab-Q3W>)1 z$@<;4se!+{Wq5=u8z$Wr++wdDns~h{vJFk^o#DT&UuenYs?NN=0)Mz$L4SzRt8+R1 z0DC4D*|*+Ap4|>P)97upq=lLXP*^=KSGA?ni(I}+LRqk2O_2THR(3&6D7Is(r%*wA z1onql9=HD)C%P+I2*&;Zpe8f`0EYh%TK`iQ;vYEie}Eo!OUE^F)XyIsZwBcx`UI<` znahwx-!a+WD|odh-7}6kd!9xF5sYIE z!+qzu46=%=?Bg?m>R&_g=C=2BswlyKdo?u%_ ziQGBgyaPK=If z_mWunlcR)(gX8;-Q_C`WAX(x-GR%tPB_Q+-O+gqfb;pEJEd_!$ViFuk7tQ;7Sxjb- z((0snnMyha75ue`tj3CkGmK-BCdt|YJNpM^sD?JW5z$_X$9WE1s zcQLSl$eFZq?kbXhsMR5c>dkfDYIQcX+)Vjd5<;oWa;zHagyB~!N^l}C{?AW_;;D8n z8`tVHVKijQ^j^QfnBG49PfnPibQk<Dk8eDv`uax21I zu6I%GFUr#N6=vNXE%T@hNN%q=cOOJOqPuUPTR4+X?D1+NTZKFgwyNbIm)jx>kH&_8 z9C+IZoE&y+^LTPL^h!OQJm3d&COuq?OR=(a(`K!2Y}B8>OiCdR-axQ=bb|D7RTG3m z8rS2ax~S3OSw(PIcX>~RG37aK(UFL13*o)v(7pQrOAv_ z0ElmSis>H;r9x*C8CyW}voD_=%olmX%=O||qE^Gg(D?OG6-iKcUZw&NYkMrXbYLy2 z@M;)tgWz=Q`Ir;ekq$xP79c|fqRfosysLA+?N&8vJhfoAI413C*_f_609yu)^r`{p z`QNxW?|VFkVzLyr%yCsm zs<(DCZjh>g_#dS)PP)J<=<+7UUu&^Z#$pj$2PspA-_R>2?09jB*6cSaB735R>U#)E z*OoZ(xhg&w)zssWnnE_Edo;kA0xwAe>vBqk3#G#VH^XTV{e*!DwqUn*rgB$*wvQxO zMrXaub#e}z!x}%&9>#}7H`p!)YI4xy zm$7t1cpKEjlh<*TSprQPJXgN;*58r`ae`imc#0m*4S3Ga@3SyJ9dxul%c?Klwyi*T z6}o19UJi6B%kzI*7o+>BhgD~s6jPyu{hFc0!nMkd#1a2g8^f|&b;X1u-@V1pGRN+78+A33q;)>nS>>!*k0alD(qwk; zFke}DuP2hZ{-P*C@YjoLBfs)NYd&eS{{|xBG$dVGdg_{ED?9?v!-)d*9${1w5ND|DEEalDj}lv`yiz^p-WC$DsA(G6bf($TvJBcjQZ^9~H9 zyN4dl>;97CbK{V+g|*@8$DQ5Eb#AzUM*7{U;yTXtMVJ&GIJByZnKh$@#IdJY#ggt~ z6H1CL$ePlWX(w!y1@`nhnJ>s6jAuHekLQ>h@{PMa!r$?e8;(OSxDVsl41xD}j;~+I zdkHRE5Laj3AO;LAQ%{(9Uy42V+;M;dZieNYLPzHzKnvIV3S=d-2Qn;V;F4nv1_dalVbvwJ*5FtxC zcAJ{9VJ@!+l@#8Y5zN*SdU5bJbT4n&$(gkPjnd2R*gl*Xo1M?0vgQXxtvA(eo?yQN zZN)&&AN8ZJtnOAY%C4X=C26vW+V=qV-V2RFq8m;xp?TSrGRJu2PgEaRsz3RCMR8L2 zJ}^Cj^a4v-u8gPA1v=K0XZ^*1*? zIFTuN99ele=r2`P!N+x;YTO%Tu|cdQZG|D?E2XKbh>VG{I%R>NGgigF>UPUWvvK_T z=^A?fY>ofN4DA0~f9Idg+y7_pFi8H#+ngW%gYMmn6iy`Zz``NelDtTt!W$mX&?A{Y z1FG#FXz2TDQ#8GFj@BS;Gb0P*PIjifp~-?g4Z@=mE*-I)Q-{-AA#M0n4egT9Od^&= zPN&E=%0Am6orc5}S)}gUN^L0Qjo{1vD&`u54+*2pnc%aV| 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'GridContext')); diff --git a/packages/web-components/src/components/grid/grid.stories.ts b/packages/web-components/src/components/grid/grid.stories.ts index 9f081e2d92f6..18a5a632e1e3 100644 --- a/packages/web-components/src/components/grid/grid.stories.ts +++ b/packages/web-components/src/components/grid/grid.stories.ts @@ -45,10 +45,83 @@ export const Default = { ?condensed=${condensed} ?narrow=${narrow} ?full-width=${fullWidth}> - - - - + + + + + + `, +}; + +export const MixedGutterModes = { + parameters: { + percy: { + skip: true, + }, + }, + render: () => + html` + + + + + +
Text
+
+ +
Text
+
+ +
Text
+
+ +
Text
+
+ + + Text + Text + + + +
Text
+
+ +
Text
+
+
+
+
+
+
+
+
+
+
+ + + + + + + +
Text
+
+ +
Text
+
+ +
Text
+
+ +
Text
+
+
+
+
+
`, }; +export const Responsive = { + args: defaultArgs, + argTypes: controls, + parameters: { + percy: { + skip: true, + }, + }, + render: ({ condensed, narrow, fullWidth }) => + html` + +

Small: Span 2 of 4

+

Medium: Span 4 of 8

+

Large: Span 6 of 16

+
+ +

Small: Span 2 of 4

+

Medium: Span 2 of 8

+

Large: Span 3 of 16

+
+ +

Small: Span 0 of 4

+

Medium: Span 2 of 8

+

Large: Span 3 of 16

+
+ +

Small: Span 0 of 4

+

Medium: Span 0 of 8

+

Large: Span 4 of 16

+
+ +

Small: Span 25%

+

Medium: Span 50%

+

Large: Span 75%

+
+
+ `, +}; + export const SubGrid = { args: defaultArgs, argTypes: controls, @@ -115,44 +229,44 @@ export const SubGrid = {

Large: Span 10 of 16

-

sm="1"

-

md="1"

-

lg="2"

+

sm=1

+

md=1

+

lg=2

-

sm="1"

-

md="1"

-

lg="2"

+

sm=1

+

md=1

+

lg=2

-

sm="0"

-

md="1"

-

lg="1"

+

sm=0

+

md=1

+

lg=1

-

sm="0"

-

md="1"

-

lg="1"

+

sm=0

+

md=1

+

lg=1

-

sm="0"

-

md="0"

-

lg="1"

+

sm=0

+

md=0

+

lg=1

-

sm="0"

-

md="0"

-

lg="1"

+

sm=0

+

md=0

+

lg=1

-

sm="0"

-

md="0"

-

lg="1"

+

sm=0

+

md=0

+

lg=1

-

sm="0"

-

md="0"

-

lg="1"

+

sm=0

+

md=0

+

lg=1

@@ -178,9 +292,3 @@ const meta = { }; export default meta; - -// -// -// -// -// diff --git a/packages/web-components/src/components/grid/grid.ts b/packages/web-components/src/components/grid/grid.ts index 29713f09fa52..d42058a30ab2 100644 --- a/packages/web-components/src/components/grid/grid.ts +++ b/packages/web-components/src/components/grid/grid.ts @@ -8,6 +8,8 @@ */ import { LitElement, html } from 'lit'; +import { provide } from '@lit/context'; +import { GridContext, gridContext } from './grid-context'; import { property } from 'lit/decorators.js'; import { carbonElement as customElement } from '../../globals/decorators/carbon-element'; import { prefix } from '../../globals/settings'; @@ -37,19 +39,22 @@ class CDSGrid extends LitElement { @property({ reflect: true, attribute: 'narrow', type: Boolean }) narrow = false; - /** - * Grid is nested within another grid - */ - @property({ reflect: true, attribute: 'sub-grid', type: Boolean }) - subGrid = false; - /** * Remove the default max width that the grid has set */ @property({ reflect: true, attribute: 'full-width', type: Boolean }) fullWidth = false; + @provide({ context: gridContext }) + @property({ attribute: false }) + public gridContext: GridContext = { + condensed: false, + narrow: false, + }; + render() { + this.gridContext = { condensed: this.condensed, narrow: this.narrow }; + // Grid styling added to contained components, allowing CSS Grid // to affect the it's own slot content. return html`
diff --git a/packages/web-components/src/components/grid/sub-grid.ts b/packages/web-components/src/components/grid/sub-grid.ts index e78e8c9ee6d2..b66517f188db 100644 --- a/packages/web-components/src/components/grid/sub-grid.ts +++ b/packages/web-components/src/components/grid/sub-grid.ts @@ -8,22 +8,62 @@ */ import { LitElement, html } from 'lit'; +import { consume } from '@lit/context'; import { property } from 'lit/decorators.js'; import { carbonElement as customElement } from '../../globals/decorators/carbon-element'; import { prefix } from '../../globals/settings'; import styles from './sub-grid.scss?lit'; import { SUB_GRID_MODE } from './defs'; +import { GridContext, gridContext } from './grid-context'; export { SUB_GRID_MODE } from './defs'; @customElement(`${prefix}-sub-grid`) class CDSSubGrid extends LitElement { + @consume({ context: gridContext, subscribe: true }) + @property({ attribute: false }) + public gridContext?: GridContext; + /** * Remove the default max width that the grid has set */ @property({ reflect: true, attribute: 'mode' }) mode = SUB_GRID_MODE.WIDE; + /** + * Collapse the gutter to 1px. Useful for fluid layouts. + * Rows have 1px of margin between them to match gutter. + */ + @property({ reflect: true, attribute: 'condensed', type: Boolean }) + condensed = false; + + /** + * Container hangs 16px into the gutter. Useful for + * typographic alignment with and without containers. + */ + @property({ reflect: true, attribute: 'narrow', type: Boolean }) + narrow = false; + + /** + * Wide reset to default grid styling. + */ + @property({ reflect: true, attribute: 'wide', type: Boolean }) + wide = false; + render() { + if (this.narrow) { + this.mode = SUB_GRID_MODE.NARROW; + } else if (this.condensed) { + this.mode = SUB_GRID_MODE.CONDENSED; + } else if (this.wide) { + this.mode = SUB_GRID_MODE.WIDE; + } else if (this.gridContext?.narrow) { + this.mode = SUB_GRID_MODE.NARROW; + } else if (this.gridContext?.condensed) { + this.mode = SUB_GRID_MODE.CONDENSED; + } else { + this.mode = SUB_GRID_MODE.WIDE; + } + // Grid styling added to contained components, allowing CSS Grid // to affect the it's own slot content. return html`
diff --git a/yarn.lock b/yarn.lock index 180a505695d3..d9311e535b9e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2317,6 +2317,7 @@ __metadata: "@floating-ui/dom": "npm:^1.6.3" "@ibm/telemetry-js": "npm:^1.5.0" "@juggle/resize-observer": "npm:^3.4.0" + "@lit/context": "npm:1.1.3" "@mordech/vite-lit-loader": "npm:^0.37.0" "@rollup/plugin-alias": "npm:^5.1.0" "@rollup/plugin-commonjs": "npm:^28.0.0" @@ -3936,7 +3937,16 @@ __metadata: languageName: node linkType: hard -"@lit/reactive-element@npm:^2.0.4": +"@lit/context@npm:1.1.3": + version: 1.1.3 + resolution: "@lit/context@npm:1.1.3" + dependencies: + "@lit/reactive-element": "npm:^1.6.2 || ^2.0.0" + checksum: 10/d2ceb8a74e36c8ceef642b6c3f1c8f77a75d08d26a1a204da9e202b586ad9bf2f981d84594666ec34e0a80960e483816e9ff63530f33ac342146fea62ca30a90 + languageName: node + linkType: hard + +"@lit/reactive-element@npm:^1.6.2 || ^2.0.0, @lit/reactive-element@npm:^2.0.4": version: 2.0.4 resolution: "@lit/reactive-element@npm:2.0.4" dependencies: From 6bc2af3f06a92ebe5f5beb516d7a7ae50137b747 Mon Sep 17 00:00:00 2001 From: Lee Chase Date: Mon, 11 Nov 2024 14:40:37 +0000 Subject: [PATCH 4/9] fix: story styles --- .../src/components/grid/grid-story.scss | 40 ++++--- .../src/components/grid/grid.mdx | 4 +- .../src/components/grid/grid.stories.ts | 111 ++++++++++-------- 3 files changed, 84 insertions(+), 71 deletions(-) diff --git a/packages/web-components/src/components/grid/grid-story.scss b/packages/web-components/src/components/grid/grid-story.scss index db5ee8ae3ebb..d895b2d0a8a9 100644 --- a/packages/web-components/src/components/grid/grid-story.scss +++ b/packages/web-components/src/components/grid/grid-story.scss @@ -9,7 +9,7 @@ .sb-css-grid-container { // Gutter modes - cds-grid::part(grid) { + .sb-grid::part(grid) { background-color: $blue-20; outline: 1px dashed $blue-40; // row-gap: $spacing-05; @@ -24,52 +24,53 @@ // } // Narrow - cds-grid[narrow]::part(grid) { + .sb-grid[narrow]::part(grid) { background-color: #d6f9f9; outline: 1px dashed $green-40; } // Condensed - cds-grid[condensed]::part(grid) { + .sb-grid[condensed]::part(grid) { background-color: $purple-10; outline: 1px dashed $purple-40; } - cds-sub-grid::part(grid) { + .sb-sub-grid::part(grid) { position: relative; background: #eef4ff; + /* stylelint-disable-next-line color-named */ outline: 1px solid black; padding-block: 2rem; } - cds-sub-grid::part(grid), - cds-sub-grid[mode='wide']::part(grid) { + .sb-sub-grid::part(grid), + .sb-sub-grid[mode='wide']::part(grid) { --grid-mode-color: #97c1ff; } - cds-rid[narrow]::part(grid), - cds-sub-grid[mode='narrow']::part(grid) { + .sb-grid[narrow]::part(grid), + .sb-sub-grid[mode='narrow']::part(grid) { --grid-mode-color: #20d5d2; background: $green-10; } - cds-grid[condensed]::part(grid), - cds-sub-grid[mode='condensed']::part(grid) { + .sb-grid[condensed]::part(grid), + .sb-sub-grid[mode='condensed']::part(grid) { --grid-mode-color: #bb8eff; background: $purple-10; } - cds-sub-grid[mode='narrow']::part(grid) { + .sb-sub-grid[mode='narrow']::part(grid) { background: #d6f9f9; } - cds-sub-grid[mode='condensed']::part(grid) { + .sb-sub-grid[mode='condensed']::part(grid) { background: #f7f2ff; } - cds-sub-grid::part(grid)::before { + .sb-sub-grid::part(grid)::before { @include type-style('code-01'); position: absolute; @@ -83,7 +84,7 @@ } // // Column - cds-column { + .sb-column { --border-color: #97c1ff; background: $white; @@ -92,17 +93,18 @@ min-block-size: 80px; } - cds-sub-grid[mode='narrow']::part(grid) cds-column, - cds-grid[narrow]::part(grid) cds-column { + .sb-sub-grid[mode='narrow']::part(grid) .sb-column, + .sb-grid[narrow]::part(grid) .sb-column { --border-color: #20d5d2; } - cds-sub-grid[mode='condensed']::part(grid) cds-column, - cds-grid[condensed]::part(grid) cds-column { + .sb-sub-grid[mode='condensed']::part(grid) .sb-column, + .sb-grid[condensed]::part(grid) .sb-column { --border-color: #bb8eff; } } -.cds--grid-part cds-column cds-grid::part(grid) { +.cds--grid-part .sb-column .sb-grid::part(grid) { + /* stylelint-disable-next-line color-named */ box-shadow: 0 0 5px black; } diff --git a/packages/web-components/src/components/grid/grid.mdx b/packages/web-components/src/components/grid/grid.mdx index d630b528f115..d26f3163ae81 100644 --- a/packages/web-components/src/components/grid/grid.mdx +++ b/packages/web-components/src/components/grid/grid.mdx @@ -28,11 +28,11 @@ import '@carbon/web-components/es/components/grid/index.js'; ### HTML ```html -111 ``` -## `` attributes, properties and events +## `` attributes, properties and events diff --git a/packages/web-components/src/components/grid/grid.stories.ts b/packages/web-components/src/components/grid/grid.stories.ts index 18a5a632e1e3..9855f23c571e 100644 --- a/packages/web-components/src/components/grid/grid.stories.ts +++ b/packages/web-components/src/components/grid/grid.stories.ts @@ -42,13 +42,14 @@ export const Default = { }, render: ({ condensed, narrow, fullWidth }) => html` - - - - + + + +