diff --git a/packages/accordion/src/spectrum-accordion-item.css b/packages/accordion/src/spectrum-accordion-item.css index 12bf0f834b6..09859748d99 100644 --- a/packages/accordion/src/spectrum-accordion-item.css +++ b/packages/accordion/src/spectrum-accordion-item.css @@ -45,8 +45,7 @@ inset-block-start: max(0px, calc((var(--mod-accordion-min-block-size, var(--spectrum-accordion-min-block-size)) - var(--mod-accordion-disclosure-indicator-height, var(--spectrum-accordion-disclosure-indicator-height))) / 2)); } -.iconContainer:dir(rtl), -:host([dir="rtl"]) .iconContainer { +.iconContainer:dir(rtl) { transform: scaleX(-1); } diff --git a/packages/accordion/src/spectrum-accordion.css b/packages/accordion/src/spectrum-accordion.css index c4f79e97ee4..b7121a17868 100644 --- a/packages/accordion/src/spectrum-accordion.css +++ b/packages/accordion/src/spectrum-accordion.css @@ -51,8 +51,7 @@ ); } -:host:dir(rtl), -:host([dir="rtl"]) { +:host:dir(rtl) { --spectrum-logical-rotation: matrix(-1, 0, 0, 1, 0, 0); } diff --git a/packages/action-button/src/spectrum-action-button.css b/packages/action-button/src/spectrum-action-button.css index 210ddc0591a..033baee723e 100644 --- a/packages/action-button/src/spectrum-action-button.css +++ b/packages/action-button/src/spectrum-action-button.css @@ -101,8 +101,7 @@ --spectrum-actionbutton-focus-indicator-color: var(--highcontrast-actionbutton-focus-indicator-color, var(--mod-actionbutton-focus-indicator-color, var(--spectrum-focus-indicator-color))); } -:host:dir(rtl), -:host([dir="rtl"]) { +:host:dir(rtl) { --spectrum-logical-rotation: matrix(-1, 0, 0, 1, 0, 0); } diff --git a/packages/action-group/src/action-group.css b/packages/action-group/src/action-group.css index cc542760182..fa6ca393786 100644 --- a/packages/action-group/src/action-group.css +++ b/packages/action-group/src/action-group.css @@ -18,7 +18,7 @@ --spectrum-actiongroup-vertical-spacing-regular: var(--spectrum-spacing-75); } -:host([dir][compact][vertical]) ::slotted(:nth-child(n)) { +:host([compact][vertical]) ::slotted(:nth-child(n)) { margin-right: 0; margin-left: 0; } @@ -41,32 +41,26 @@ } :host([compact][vertical]:not([quiet])) ::slotted(:not([role]):first-child) { - /* [dir=ltr] .spectrum-ActionGroup--compact:not(.spectrum-ActionGroup--quiet) .spectrum-ActionGroup-item:first-child */ --overriden-border-radius: var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) 0 0; } :host([compact][vertical]:not([quiet])) ::slotted(:not([role]):last-child) { - /* [dir=ltr] .spectrum-ActionGroup--compact:not(.spectrum-ActionGroup--quiet) .spectrum-ActionGroup-item:last-child */ --overriden-border-radius: 0 0 var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)); } -:host([dir="ltr"][compact]:not([quiet], [vertical])) ::slotted(:not([role]):first-child) { - /* [dir=ltr] .spectrum-ActionGroup--compact:not(.spectrum-ActionGroup--quiet) .spectrum-ActionGroup-item:first-child */ +:host([compact]:not([quiet], [vertical])) ::slotted(:not([role]):first-child) { --overriden-border-radius: var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) 0 0 var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)); } -:host([dir="rtl"][compact]:not([quiet], [vertical])) ::slotted(:not([role]):first-child) { - /* [dir=rtl] .spectrum-ActionGroup--compact:not(.spectrum-ActionGroup--quiet) .spectrum-ActionGroup-item:first-child */ +:host([compact]:not([quiet], [vertical]):dir(rtl)) ::slotted(:not([role]):first-child) { --overriden-border-radius: 0 var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) 0; } -:host([dir="ltr"][compact]:not([quiet], [vertical])) ::slotted(:not([role]):last-child) { - /* [dir=ltr] .spectrum-ActionGroup--compact:not(.spectrum-ActionGroup--quiet) .spectrum-ActionGroup-item:last-child */ +:host([compact]:not([quiet], [vertical])) ::slotted(:not([role]):last-child) { --overriden-border-radius: 0 var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) 0; } -:host([dir="rtl"][compact]:not([quiet], [vertical])) ::slotted(:not([role]):last-child) { - /* [dir=rtl] .spectrum-ActionGroup--compact:not(.spectrum-ActionGroup--quiet) .spectrum-ActionGroup-item:last-child */ +:host([compact]:not([quiet], [vertical]):dir(rtl)) ::slotted(:not([role]):last-child) { --overriden-border-radius: var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) 0 0 var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)); } @@ -75,32 +69,26 @@ } :host([compact][vertical]:not([quiet])) ::slotted(:first-child) { - /* [dir=ltr] .spectrum-ActionGroup--compact:not(.spectrum-ActionGroup--quiet) .spectrum-ActionGroup-item:first-child */ --mod-actionbutton-focus-ring-border-radius: var(--spectrum-alias-component-border-radius) var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) 0 0; } :host([compact][vertical]:not([quiet])) ::slotted(:last-child) { - /* [dir=ltr] .spectrum-ActionGroup--compact:not(.spectrum-ActionGroup--quiet) .spectrum-ActionGroup-item:last-child */ --mod-actionbutton-focus-ring-border-radius: 0 0 var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)); } -:host([dir="ltr"][compact]:not([quiet], [vertical])) ::slotted(:first-child) { - /* [dir=ltr] .spectrum-ActionGroup--compact:not(.spectrum-ActionGroup--quiet) .spectrum-ActionGroup-item:first-child */ +:host([compact]:not([quiet], [vertical])) ::slotted(:first-child) { --mod-actionbutton-focus-ring-border-radius: var(--spectrum-alias-component-border-radius) 0 0 var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)); } -:host([dir="rtl"][compact]:not([quiet], [vertical])) ::slotted(:first-child) { - /* [dir=rtl] .spectrum-ActionGroup--compact:not(.spectrum-ActionGroup--quiet) .spectrum-ActionGroup-item:first-child */ +:host([compact]:not([quiet], [vertical]):dir(rtl)) ::slotted(:first-child) { --mod-actionbutton-focus-ring-border-radius: 0 var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) 0; } -:host([dir="ltr"][compact]:not([quiet], [vertical])) ::slotted(:last-child) { - /* [dir=ltr] .spectrum-ActionGroup--compact:not(.spectrum-ActionGroup--quiet) .spectrum-ActionGroup-item:last-child */ +:host([compact]:not([quiet], [vertical])) ::slotted(:last-child) { --mod-actionbutton-focus-ring-border-radius: 0 var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)) 0; } -:host([dir="rtl"][compact]:not([quiet], [vertical])) ::slotted(:last-child) { - /* [dir=rtl] .spectrum-ActionGroup--compact:not(.spectrum-ActionGroup--quiet) .spectrum-ActionGroup-item:last-child */ +:host([compact]:not([quiet], [vertical]):dir(rtl)) ::slotted(:last-child) { --mod-actionbutton-focus-ring-border-radius: var(--spectrum-alias-component-border-radius) 0 0 var(--mod-actiongroup-border-radius, var(--spectrum-actiongroup-border-radius)); } diff --git a/packages/action-group/test/action-group.test.ts b/packages/action-group/test/action-group.test.ts index 6f9e4f92dff..5f84165c8aa 100644 --- a/packages/action-group/test/action-group.test.ts +++ b/packages/action-group/test/action-group.test.ts @@ -1491,7 +1491,7 @@ describe('ActionGroup', () => { `); await acceptKeyboardInput(el); }); - it('accepts keybord input when [dir="ltr"]', async () => { + it('accepts keybord input when in left-to-right direction', async () => { const el = await fixture(html` { green 100% ); } - sp-slider[dir='rtl'] { + sp-slider:dir(rtl) { --mod-slider-track-color: linear-gradient( to left, red, diff --git a/packages/split-view/src/SplitView.ts b/packages/split-view/src/SplitView.ts index 01d050c588e..332056c6072 100644 --- a/packages/split-view/src/SplitView.ts +++ b/packages/split-view/src/SplitView.ts @@ -272,7 +272,7 @@ export class SplitView extends SpectrumElement { private onPointermove(event: PointerEvent): void { event.preventDefault(); let pos = - this.vertical || this.isLTR + this.vertical || this.dir === 'ltr' ? this.getPosition(event) - this.offset : this.offset - this.getPosition(event); if (this.collapsible && pos < this.minPos - COLLAPSE_THREASHOLD) { @@ -292,7 +292,7 @@ export class SplitView extends SpectrumElement { if (!this.rect) { this.rect = this.getBoundingClientRect(); } - const offsetX = this.isLTR ? this.rect.left : this.rect.right; + const offsetX = this.dir === 'ltr' ? this.rect.left : this.rect.right; return this.vertical ? this.rect.top : offsetX; } @@ -312,7 +312,7 @@ export class SplitView extends SpectrumElement { return; } let direction = 0; - const isLTRorVertical = this.isLTR || this.vertical; + const isLTRorVertical = this.dir === 'ltr' || this.vertical; switch (event.key) { case 'Home': event.preventDefault(); diff --git a/packages/split-view/src/split-view.css b/packages/split-view/src/split-view.css index e6f143dcd02..c3d9aae4704 100644 --- a/packages/split-view/src/split-view.css +++ b/packages/split-view/src/split-view.css @@ -61,13 +61,13 @@ cursor: ns-resize; } -:host([resizable][dir="ltr"]) #splitter.is-resized-start, -:host([resizable][dir="rtl"]) #splitter.is-resized-end { +:host([resizable]) #splitter.is-resized-start, +:host([resizable]) #splitter.is-resized-end:dir(rtl) { cursor: e-resize; } -:host([resizable][dir="ltr"]) #splitter.is-resized-end, -:host([resizable][dir="rtl"]) #splitter.is-resized-start { +:host([resizable]) #splitter.is-resized-end, +:host([resizable]) #splitter.is-resized-start:dir(rtl) { cursor: w-resize; } @@ -84,13 +84,13 @@ cursor: ew-resize; } -:host([resizable][dir="ltr"][collapsible]) #splitter.is-collapsed-start, -:host([resizable][dir="rtl"][collapsible]) #splitter.is-collapsed-end { +:host([resizable][collapsible]) #splitter.is-collapsed-start, +:host([resizable][collapsible]) #splitter.is-collapsed-end:dir(rtl) { cursor: e-resize; } -:host([resizable][dir="ltr"][collapsible]) #splitter.is-collapsed-end, -:host([resizable][dir="rtl"][collapsible]) #splitter.is-collapsed-start { +:host([resizable][collapsible]) #splitter.is-collapsed-end, +:host([resizable][collapsible]) #splitter.is-collapsed-start:dir(rtl) { cursor: w-resize; } diff --git a/packages/status-light/src/spectrum-status-light.css b/packages/status-light/src/spectrum-status-light.css index 7a37b8242b5..ce993592f0a 100644 --- a/packages/status-light/src/spectrum-status-light.css +++ b/packages/status-light/src/spectrum-status-light.css @@ -10,7 +10,6 @@ * governing permissions and limitations under the License. */ -:host([dir]), :host { --spectrum-statuslight-height: var(--spectrum-component-height-100); --spectrum-statuslight-dot-size: var(--spectrum-status-light-dot-size-medium); @@ -51,7 +50,7 @@ --spectrum-statuslight-spacing-bottom-to-label: var(--spectrum-component-bottom-to-text-300); } -:host([dir]) { +:host { --spectrum-statuslight-corner-radius: 50%; --spectrum-statuslight-font-weight: 400; --spectrum-statuslight-border-width: var(--spectrum-border-width-100); @@ -79,6 +78,7 @@ --spectrum-statuslight-nonsemantic-purple-color: var(--spectrum-purple-visual-color); --spectrum-statuslight-nonsemantic-fuchsia-color: var(--spectrum-fuchsia-visual-color); --spectrum-statuslight-nonsemantic-magenta-color: var(--spectrum-magenta-visual-color); + min-block-size: var(--mod-statuslight-height, var(--spectrum-statuslight-height)); box-sizing: border-box; font-size: var(--mod-statuslight-font-size, var(--spectrum-statuslight-font-size)); @@ -199,9 +199,10 @@ } @media (forced-colors: active) { - :host([dir]) { + :host(:dir(ltr)) { --highcontrast-statuslight-content-color-default: CanvasText; --highcontrast-statuslight-subdued-content-color-default: CanvasText; + forced-color-adjust: none; } diff --git a/packages/switch/src/spectrum-switch.css b/packages/switch/src/spectrum-switch.css index bdcf8069a47..c33f7bf7c84 100644 --- a/packages/switch/src/spectrum-switch.css +++ b/packages/switch/src/spectrum-switch.css @@ -109,8 +109,7 @@ transform: translateX(calc(var(--mod-switch-control-width, var(--spectrum-switch-control-width)) - 100%)); } -:host([checked]) #input + #switch:dir(rtl):before, -:host([dir="rtl"][checked]) #input + #switch:before { +:host([checked]) #input + #switch:dir(rtl):before { transform: translateX(calc((var(--mod-switch-control-width, var(--spectrum-switch-control-width)) - 100%) * -1)); } diff --git a/packages/table/src/spectrum-table.css b/packages/table/src/spectrum-table.css index d182a4034f0..6145b040f9c 100644 --- a/packages/table/src/spectrum-table.css +++ b/packages/table/src/spectrum-table.css @@ -86,8 +86,7 @@ --mod-thumbnail-size: var(--mod-table-thumbnail-size, var(--spectrum-table-thumbnail-size)); } -:host:dir(rtl), -:host([dir="rtl"]) { +:host:dir(rtl) { --spectrum-logical-rotation: matrix(-1, 0, 0, 1, 0, 0); } diff --git a/packages/tabs/src/Tabs.ts b/packages/tabs/src/Tabs.ts index 0c66f010a11..9ed9dcdd7f7 100644 --- a/packages/tabs/src/Tabs.ts +++ b/packages/tabs/src/Tabs.ts @@ -59,7 +59,7 @@ export const ScaledIndicator = { :host([direction='vertical']) #selection-indicator { height: ${this.baseSize}px; } - :host([dir][direction='horizontal']) #selection-indicator { + :host([direction='horizontal']) #selection-indicator { width: ${this.baseSize}px; } `; diff --git a/packages/tabs/src/spectrum-tabs.css b/packages/tabs/src/spectrum-tabs.css index 326db73d9ae..5ed8850e312 100644 --- a/packages/tabs/src/spectrum-tabs.css +++ b/packages/tabs/src/spectrum-tabs.css @@ -56,13 +56,11 @@ --mod-tabs-list-background-direction: var(--mod-tabs-list-background-direction-vertical-right, left); } -:host([direction^="vertical"]) #list:dir(rtl), -:host([dir="rtl"][direction^="vertical"]) #list { +:host([direction^="vertical"]) #list:dir(rtl) { --mod-tabs-list-background-direction: var(--mod-tabs-list-background-direction-vertical, left); } -:host([direction^="vertical-right"]) #list:dir(rtl), -:host([dir="rtl"][direction^="vertical-right"]) #list { +:host([direction^="vertical-right"]) #list:dir(rtl) { --mod-tabs-list-background-direction: var(--mod-tabs-list-background-direction-vertical, right); } diff --git a/packages/tabs/src/tab.css b/packages/tabs/src/tab.css index 429d3dfc9ae..e51c94d5e2f 100644 --- a/packages/tabs/src/tab.css +++ b/packages/tabs/src/tab.css @@ -61,7 +61,7 @@ height: auto; } -:host([dir][vertical]) slot[name="icon"] + #item-label { +:host([vertical]) slot[name="icon"] + #item-label { margin-inline-start: 0; margin-block: calc(var(--mod-tabs-top-to-text, var(--spectrum-tabs-top-to-text)) / 2) calc(var(--mod-tabs-bottom-to-text, var(--spectrum-tabs-bottom-to-text)) / 2); } diff --git a/packages/tabs/src/tabs.css b/packages/tabs/src/tabs.css index c76b3168ebb..43025202070 100644 --- a/packages/tabs/src/tabs.css +++ b/packages/tabs/src/tabs.css @@ -27,7 +27,7 @@ grid-template-columns: auto 1fr; } -:host([dir="rtl"]) #selection-indicator { +#selection-indicator:dir(rtl) { left: 0; right: auto; } @@ -66,11 +66,11 @@ transition: none; } -:host([dir][direction="horizontal"]) #list.scroll { +:host([direction="horizontal"]) #list.scroll { scrollbar-width: none; overflow: auto hidden; } -:host([dir][direction="horizontal"]) #list.scroll::-webkit-scrollbar { +:host([direction="horizontal"]) #list.scroll::-webkit-scrollbar { display: none; } diff --git a/packages/toast/src/spectrum-toast.css b/packages/toast/src/spectrum-toast.css index b93b95d3bf9..d77789e5331 100644 --- a/packages/toast/src/spectrum-toast.css +++ b/packages/toast/src/spectrum-toast.css @@ -148,8 +148,7 @@ margin-inline-end: var(--mod-toast-spacing-text-and-action-button-to-divider, var(--spectrum-toast-spacing-text-and-action-button-to-divider)); } -.body ::slotted([slot="action"]:dir(rtl)), -:host([dir="rtl"]) .body ::slotted([slot="action"]) { +.body ::slotted([slot="action"]:dir(rtl)) { margin-inline-end: var(--mod-toast-spacing-text-and-action-button-to-divider, var(--spectrum-toast-spacing-text-and-action-button-to-divider)); } diff --git a/packages/tooltip/src/spectrum-tooltip.css b/packages/tooltip/src/spectrum-tooltip.css index 1bc7074c590..cdc9e0761cd 100644 --- a/packages/tooltip/src/spectrum-tooltip.css +++ b/packages/tooltip/src/spectrum-tooltip.css @@ -191,9 +191,7 @@ } .spectrum-Tooltip--bottom-start #tip:dir(rtl), -.spectrum-Tooltip--top-start #tip:dir(rtl), -:host([dir="rtl"]) .spectrum-Tooltip--bottom-start #tip, -:host([dir="rtl"]) .spectrum-Tooltip--top-start #tip { +.spectrum-Tooltip--top-start #tip:dir(rtl) { right: var(--mod-tooltip-pointer-corner-spacing, var(--spectrum-tooltip-pointer-corner-spacing)); left: auto; } @@ -204,9 +202,7 @@ } .spectrum-Tooltip--bottom-end #tip:dir(rtl), -.spectrum-Tooltip--top-end #tip:dir(rtl), -:host([dir="rtl"]) .spectrum-Tooltip--bottom-end #tip, -:host([dir="rtl"]) .spectrum-Tooltip--top-end #tip { +.spectrum-Tooltip--top-end #tip:dir(rtl) { left: var(--mod-tooltip-pointer-corner-spacing, var(--spectrum-tooltip-pointer-corner-spacing)); right: auto; } @@ -278,13 +274,7 @@ .spectrum-Tooltip--end-top #tip:dir(rtl), :host([placement*="left"]) #tooltip #tip:dir(rtl), .spectrum-Tooltip--left-bottom #tip:dir(rtl), -.spectrum-Tooltip--left-top #tip:dir(rtl), -:host([dir="rtl"]) .spectrum-Tooltip--end #tip, -:host([dir="rtl"]) .spectrum-Tooltip--end-bottom #tip, -:host([dir="rtl"]) .spectrum-Tooltip--end-top #tip, -:host([dir="rtl"][placement*="left"]) #tooltip #tip, -:host([dir="rtl"]) .spectrum-Tooltip--left-bottom #tip, -:host([dir="rtl"]) .spectrum-Tooltip--left-top #tip { +.spectrum-Tooltip--left-top #tip:dir(rtl) { clip-path: polygon(calc(0% - var(--mod-tooltip-tip-antialiasing-inset, var(--spectrum-tooltip-tip-antialiasing-inset))) 0, calc(0% - var(--mod-tooltip-tip-antialiasing-inset, var(--spectrum-tooltip-tip-antialiasing-inset))) 100%, var(--mod-tooltip-tip-height-percentage, var(--spectrum-tooltip-tip-height-percentage)) 50%); left: 100%; right: auto; @@ -295,13 +285,7 @@ .spectrum-Tooltip--right-top #tip:dir(rtl), .spectrum-Tooltip--start #tip:dir(rtl), .spectrum-Tooltip--start-bottom #tip:dir(rtl), -.spectrum-Tooltip--start-top #tip:dir(rtl), -:host([dir="rtl"][placement*="right"]) #tooltip #tip, -:host([dir="rtl"]) .spectrum-Tooltip--right-bottom #tip, -:host([dir="rtl"]) .spectrum-Tooltip--right-top #tip, -:host([dir="rtl"]) .spectrum-Tooltip--start #tip, -:host([dir="rtl"]) .spectrum-Tooltip--start-bottom #tip, -:host([dir="rtl"]) .spectrum-Tooltip--start-top #tip { +.spectrum-Tooltip--start-top #tip:dir(rtl) { clip-path: polygon(var(--mod-tooltip-tip-height-percentage, var(--spectrum-tooltip-tip-height-percentage)) 50%, calc(100% + var(--mod-tooltip-tip-antialiasing-inset, var(--spectrum-tooltip-tip-antialiasing-inset))) 100%, calc(100% + var(--mod-tooltip-tip-antialiasing-inset, var(--spectrum-tooltip-tip-antialiasing-inset))) 0); left: auto; right: 100%; @@ -395,10 +379,7 @@ :host([open]) .spectrum-Tooltip--start-bottom:dir(rtl), :host([open]) .spectrum-Tooltip--start-top:dir(rtl), -:host([open]) .spectrum-Tooltip--start:dir(rtl), -:host([dir="rtl"][open]) .spectrum-Tooltip--start-bottom, -:host([dir="rtl"][open]) .spectrum-Tooltip--start-top, -:host([dir="rtl"][open]) .spectrum-Tooltip--start { +:host([open]) .spectrum-Tooltip--start:dir(rtl) { transform: translateX(var(--mod-tooltip-animation-distance, var(--spectrum-tooltip-animation-distance))); } @@ -416,9 +397,6 @@ :host([open]) .spectrum-Tooltip--end-bottom:dir(rtl), :host([open]) .spectrum-Tooltip--end-top:dir(rtl), -:host([open]) .spectrum-Tooltip--end:dir(rtl), -:host([dir="rtl"][open]) .spectrum-Tooltip--end-bottom, -:host([dir="rtl"][open]) .spectrum-Tooltip--end-top, -:host([dir="rtl"][open]) .spectrum-Tooltip--end { +:host([open]) .spectrum-Tooltip--end:dir(rtl) { transform: translateX(calc(var(--mod-tooltip-animation-distance, var(--spectrum-tooltip-animation-distance)) * -1)); } diff --git a/projects/documentation/src/components/layout.css b/projects/documentation/src/components/layout.css index b5942ef0479..9909c00ab55 100644 --- a/projects/documentation/src/components/layout.css +++ b/projects/documentation/src/components/layout.css @@ -29,7 +29,7 @@ docs-side-nav:not(:defined) { display: none; } -@media screen and (min-width: 961px) { +@media screen and (width >= 961px) { docs-side-nav:not(:defined) { position: sticky; top: 0; @@ -43,11 +43,11 @@ docs-side-nav:not(:defined) { flex-direction: column; } - docs-side-nav:not(:defined) ::slotted([slot='logo']) { + docs-side-nav:not(:defined) ::slotted([slot="logo"]) { margin: 0 -24px; } - docs-side-nav:not(:defined) ::slotted([slot='side-nav']) { + docs-side-nav:not(:defined) ::slotted([slot="side-nav"]) { margin-top: 56px; width: 216px; flex: 1; @@ -63,7 +63,7 @@ docs-side-nav:not(:defined) { background-color: var(--spectrum-gray-50); } -@media screen and (max-width: 960px) { +@media screen and (width <= 960px) { #body { height: 50%; grid-template-columns: 100%; @@ -71,8 +71,7 @@ docs-side-nav:not(:defined) { } #page { - padding: calc(var(--swc-scale-factor) * 40px) - calc(var(--swc-scale-factor) * 56px); + padding: calc(var(--swc-scale-factor) * 40px) calc(var(--swc-scale-factor) * 56px); max-width: 1080px; margin-left: auto; margin-right: auto; @@ -92,10 +91,9 @@ docs-side-nav:not(:defined) { flex-direction: column; } -@media screen and (max-width: 960px) { +@media screen and (width <= 960px) { #page { - padding: calc(var(--swc-scale-factor) * 8px) - calc(var(--swc-scale-factor) * 24px); + padding: calc(var(--swc-scale-factor) * 8px) calc(var(--swc-scale-factor) * 24px); } .manage-theme { @@ -104,7 +102,7 @@ docs-side-nav:not(:defined) { } } -@media screen and (min-width: 525px) { +@media screen and (width >= 525px) { .manage-theme { display: flex; flex-wrap: wrap; @@ -114,8 +112,6 @@ docs-side-nav:not(:defined) { header { position: sticky; - top: 0; - left: 0; min-height: calc(var(--swc-scale-factor) * 48px); border-bottom: 1px solid var(--spectrum-gray-200); display: flex; @@ -123,9 +119,9 @@ header { align-items: center; justify-content: space-between; background-color: var(--spectrum-gray-50); - top: 0px; - right: 0px; - left: 0px; + top: 0; + right: 0; + left: 0; padding-inline: 8px; z-index: 2; @@ -144,28 +140,12 @@ header svg { } sp-field-label:not(:defined) { - height: calc( - var( - --spectrum-fieldlabel-m-text-line-height, - var(--spectrum-alias-component-text-line-height) - ) + - var( - --spectrum-fieldlabel-m-padding-top, - calc(var(--swc-scale-factor) * 4px) - ) + - var( - --spectrum-fieldlabel-m-padding-bottom, - calc(var(--swc-scale-factor) * 5px) - ) - ); + height: calc(var(--spectrum-fieldlabel-m-text-line-height, var(--spectrum-alias-component-text-line-height)) + var(--spectrum-fieldlabel-m-padding-top, calc(var(--swc-scale-factor) * 4px)) + var(--spectrum-fieldlabel-m-padding-bottom, calc(var(--swc-scale-factor) * 5px))); min-width: 70px; } sp-picker:not(:defined) { - height: var( - --spectrum-picker-m-height, - var(--spectrum-alias-item-height-m) - ); + height: var(--spectrum-picker-m-height, var(--spectrum-alias-item-height-m)); min-width: 70px; } @@ -173,7 +153,7 @@ sp-picker:not(:defined) sp-menu-item { display: none; } -@media screen and (min-width: 961px) { +@media screen and (width >= 961px) { header { display: none; } @@ -195,8 +175,7 @@ sp-picker:not(:defined) sp-menu-item { #logo { outline: none; margin-bottom: -11px; - padding: calc(var(--swc-scale-factor) * 28px) - calc(var(--swc-scale-factor) * 24px); + padding: calc(var(--swc-scale-factor) * 28px) calc(var(--swc-scale-factor) * 24px); border-radius: 4px; display: flex; flex-direction: row; @@ -220,12 +199,9 @@ sp-picker:not(:defined) sp-menu-item { font-weight: 700; line-height: 1.3; font-style: normal; - letter-spacing: 0px; + letter-spacing: 0; margin: -3px 0 0; - font-family: var( - --spectrum-alias-body-text-font-family, - var(--spectrum-font-family) - ); + font-family: var(--spectrum-alias-body-text-font-family, var(--spectrum-font-family)); } #logo span { @@ -245,24 +221,15 @@ aside { background-color: var(--spectrum-gray-75); width: calc(var(--swc-scale-factor) * 192px); transition: - transform - var( - --spectrum-dialog-confirm-background-entry-animation-duration, - var(--spectrum-animation-duration-600) - ) - cubic-bezier(0, 0, 0.4, 1), - visibility 0s linear - var( - --spectrum-dialog-confirm-background-entry-animation-duration, - var(--spectrum-animation-duration-600) - ); + transform var(--spectrum-dialog-confirm-background-entry-animation-duration, var(--spectrum-animation-duration-600)) cubic-bezier(0, 0, 0.4, 1), + visibility 0s linear var(--spectrum-dialog-confirm-background-entry-animation-duration, var(--spectrum-animation-duration-600)); visibility: visible; } aside .manage-theme { flex-direction: column; display: flex; - padding: 0px 24px 24px; + padding: 0 24px 24px; order: 1; } @@ -293,11 +260,11 @@ sp-underlay:not([open]) + aside { visibility: hidden; } -:host([dir='rtl']) aside { +aside:dir(rtl) { left: 0; right: auto; } -:host([dir='rtl']) sp-underlay:not([open]) + aside { +sp-underlay:not([open]) + aside:dir(rtl) { transform: translateX(-100%); } diff --git a/projects/documentation/src/components/layout.ts b/projects/documentation/src/components/layout.ts index 89d5d00fb7f..1e19f3aaedf 100644 --- a/projects/documentation/src/components/layout.ts +++ b/projects/documentation/src/components/layout.ts @@ -19,7 +19,6 @@ import { } from '@spectrum-web-components/base'; import { property, - queryAsync, state, } from '@spectrum-web-components/base/src/decorators.js'; import '@spectrum-web-components/theme/sp-theme.js'; @@ -27,7 +26,6 @@ import type { Color, Scale, SystemVariant, - Theme, } from '@spectrum-web-components/theme'; import type { Picker } from '@spectrum-web-components/picker'; import '@spectrum-web-components/button/sp-button.js'; @@ -60,7 +58,6 @@ const SWC_THEME_DIR_KEY = 'swc-docs:theme:dir'; const COLOR_FALLBACK = matchMedia(DARK_MODE).matches ? 'dark' : 'light'; const SCALE_FALLBACK = matchMedia(IS_MOBILE).matches ? 'large' : 'medium'; const SYSTEM_FALLBACK = 'spectrum'; -const DIR_FALLBACK = 'ltr'; const DEFAULT_COLOR = ( window.localStorage ? localStorage.getItem(SWC_THEME_COLOR_KEY) || COLOR_FALLBACK @@ -80,9 +77,9 @@ const DEFAULT_SYSTEM = ( ) as SystemVariant; const DEFAULT_DIR = ( window.localStorage - ? localStorage.getItem(SWC_THEME_DIR_KEY) || DIR_FALLBACK - : DIR_FALLBACK -) as 'ltr' | 'rtl'; + ? (localStorage.getItem(SWC_THEME_DIR_KEY) ?? 'ltr') + : 'ltr' +) as HTMLElement['dir']; const isNarrowMediaQuery = matchMedia('screen and (max-width: 960px)'); @@ -173,9 +170,6 @@ export class LayoutElement extends LitElement { @property({ attribute: false }) public color: Color = DEFAULT_COLOR; - @property({ reflect: true }) - public override dir: 'ltr' | 'rtl' = DEFAULT_DIR; - @property({ type: Boolean }) public open = false; @@ -191,19 +185,17 @@ export class LayoutElement extends LitElement { @property({ attribute: false }) public system: SystemVariant = DEFAULT_SYSTEM; - @queryAsync('sp-theme') - private themeRoot!: Theme; + private _themeTrackers = new Map(); - public async startManagingContentDirection(el: HTMLElement): Promise { - (await this.themeRoot).startManagingContentDirection(el); - } + public constructor() { + super(); - public async stopManagingContentDirection(el: HTMLElement): Promise { - (await this.themeRoot).stopManagingContentDirection(el); + // Initialize the direction to the default value if provided + if (['ltr', 'rtl'].includes(DEFAULT_DIR)) { + this.dir = DEFAULT_DIR; + } } - private _themeTrackers = new Map(); - private handleMatchMediaChange = (event: MediaQueryListEvent) => { this.isNarrow = event.matches; }; @@ -228,9 +220,7 @@ export class LayoutElement extends LitElement { } private updateDirection(event: Event) { - const dir = (event.target as Picker).value; - this.dir = dir === 'rtl' ? dir : 'ltr'; - document.documentElement.dir = this.dir; + this.dir = (event.target as Picker).value as HTMLElement['dir']; } private handleTrackTheme(event: CustomEvent): void { diff --git a/projects/documentation/src/components/side-nav.css b/projects/documentation/src/components/side-nav.css index c61e1ba1662..463184520c3 100644 --- a/projects/documentation/src/components/side-nav.css +++ b/projects/documentation/src/components/side-nav.css @@ -26,17 +26,13 @@ aside { background-color: var(--spectrum-gray-75); } -@media screen and (max-width: 960px) { +@media screen and (width <= 960px) { aside { position: fixed; top: 0; left: 0; - transition: transform - var( - --spectrum-dialog-confirm-background-entry-animation-duration, - var(--spectrum-animation-duration-600) - ) - cubic-bezier(0, 0, 0.4, 1), + transition: + transform var(--spectrum-dialog-confirm-background-entry-animation-duration, var(--spectrum-animation-duration-600)) cubic-bezier(0, 0, 0.4, 1), visibility 0s linear var(--spectrum-animation-duration-600); transform: translateX(-100%); z-index: 10; @@ -44,7 +40,7 @@ aside { visibility: hidden; } - [dir='rtl'] + aside { + aside:dir(rtl) { right: 0; left: auto; transform: translateX(100%); @@ -71,7 +67,7 @@ aside { .navigation { width: calc(var(--swc-scale-factor) * 240px - 48px); - padding: 0 24px 24px 24px; + padding: 0 24px 24px; flex: 1; flex-grow: 1; overflow: auto; @@ -86,11 +82,11 @@ docs-spectrum-logo { padding-top: 7px; } -:host([dir='ltr']) docs-spectrum-logo { +docs-spectrum-logo:dir(ltr) { margin-right: 16px; } -:host([dir='rtl']) docs-spectrum-logo { +docs-spectrum-logo:dir(rtl) { margin-left: 16px; } @@ -101,9 +97,7 @@ docs-spectrum-logo { docs-search { width: calc(var(--swc-scale-factor) * 192px); - padding: 0 calc(var(--swc-scale-factor) * 24px) - calc(var(--swc-scale-factor) * 24px) - calc(var(--swc-scale-factor) * 24px); + padding: 0 calc(var(--swc-scale-factor) * 24px) calc(var(--swc-scale-factor) * 24px); } sp-sidenav { diff --git a/projects/story-decorator/src/StoryDecorator.ts b/projects/story-decorator/src/StoryDecorator.ts index 745824de677..6c1b3f85714 100644 --- a/projects/story-decorator/src/StoryDecorator.ts +++ b/projects/story-decorator/src/StoryDecorator.ts @@ -420,7 +420,7 @@ export class StoryDecorator extends SpectrumElement { ?checked=${this.reduceMotion} @change=${this.updateTheme} > - Reduce Motion + Reduce motion `; } diff --git a/tools/base/src/Base.ts b/tools/base/src/Base.ts index f03543c9079..b1896a35003 100644 --- a/tools/base/src/Base.ts +++ b/tools/base/src/Base.ts @@ -12,10 +12,6 @@ import { LitElement, ReactiveElement } from 'lit'; import { version } from '@spectrum-web-components/base/src/version.js'; -type ThemeRoot = HTMLElement & { - startManagingContentDirection: (el: HTMLElement) => void; - stopManagingContentDirection: (el: HTMLElement) => void; -}; type Constructor> = { // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -25,38 +21,9 @@ type Constructor> = { export interface SpectrumInterface { shadowRoot: ShadowRoot; - isLTR: boolean; hasVisibleFocusInTree(): boolean; - dir: 'ltr' | 'rtl'; } -const observedForElements: Set = new Set(); - -const updateRTL = (): void => { - const dir = - document.documentElement.dir === 'rtl' - ? document.documentElement.dir - : 'ltr'; - observedForElements.forEach((el) => { - el.setAttribute('dir', dir); - }); -}; - -const rtlObserver = new MutationObserver(updateRTL); - -rtlObserver.observe(document.documentElement, { - attributes: true, - attributeFilter: ['dir'], -}); - -type ContentDirectionManager = HTMLElement & { - startManagingContentDirection?(): void; -}; - -const canManageContentDirection = (el: ContentDirectionManager): boolean => - typeof el.startManagingContentDirection !== 'undefined' || - el.tagName === 'SP-THEME'; - export function SpectrumMixin>( constructor: T ): T & Constructor { @@ -65,19 +32,6 @@ export function SpectrumMixin>( * @private */ public override shadowRoot!: ShadowRoot; - private _dirParent?: HTMLElement; - - /** - * @private - */ - public override dir!: 'ltr' | 'rtl'; - - /** - * @private - */ - public get isLTR(): boolean { - return this.dir === 'ltr'; - } public hasVisibleFocusInTree(): boolean { const getAncestors = (root: Document = document): HTMLElement[] => { @@ -125,63 +79,8 @@ export function SpectrumMixin>( return activeElement.matches('.focus-visible'); } } - - public override connectedCallback(): void { - if (!this.hasAttribute('dir')) { - let dirParent = ((this as HTMLElement).assignedSlot || - this.parentNode) as HTMLElement; - while ( - dirParent !== document.documentElement && - !canManageContentDirection( - dirParent as ContentDirectionManager - ) - ) { - dirParent = ((dirParent as HTMLElement).assignedSlot || // step into the shadow DOM of the parent of a slotted node - dirParent.parentNode || // DOM Element detected - (dirParent as unknown as ShadowRoot) - .host) as HTMLElement; - } - this.dir = - dirParent.dir === 'rtl' ? dirParent.dir : this.dir || 'ltr'; - if (dirParent === document.documentElement) { - observedForElements.add(this); - } else { - const { localName } = dirParent; - if ( - localName.search('-') > -1 && - !customElements.get(localName) - ) { - /* c8 ignore next 5 */ - customElements.whenDefined(localName).then(() => { - ( - dirParent as ThemeRoot - ).startManagingContentDirection(this); - }); - } else { - (dirParent as ThemeRoot).startManagingContentDirection( - this - ); - } - } - this._dirParent = dirParent as HTMLElement; - } - super.connectedCallback(); - } - - public override disconnectedCallback(): void { - super.disconnectedCallback(); - if (this._dirParent) { - if (this._dirParent === document.documentElement) { - observedForElements.delete(this); - } else { - (this._dirParent as ThemeRoot).stopManagingContentDirection( - this - ); - } - this.removeAttribute('dir'); - } - } } + return SpectrumMixinElement; } diff --git a/tools/base/test/base.test.ts b/tools/base/test/base.test.ts index 180669e1d8d..70ba2535903 100644 --- a/tools/base/test/base.test.ts +++ b/tools/base/test/base.test.ts @@ -21,19 +21,17 @@ describe('Base', () => { after(() => { document.dir = ''; }); - it('sets `dir` from `document`', async () => { + it('component understands `dir` from `document`', async () => { document.dir = 'rtl'; - const el = await fixture( - html` - - ` - ); + const el = await fixture(html` + + `); await elementUpdated(el); expect(el.dir).to.equal('rtl'); - expect(el.isLTR).to.be.false; }); + it('has a static VERSION property', () => { expect(DirElement.VERSION).to.equal(version); });