@import "foundation/base"; .icon-browser { // POSITIONING FIXES: // Foundation's "reveal" component assumes pages never scroll sideways, lol. // The icon browser JS fixes the left position, but we also need to handle // the centering at desktop widths. (By default it uses auto-margins for // centering, but that's not reliable once left != 0.) // Override the default (100px) gap between top of viewport and top of // modal, bc we want it to be 0 on mobile. (This isn't the "real" top // property, it's just a hint to the reveal-modal js.) top: 0; // On mobile, the modal's width is 100vw and we don't need to center // On tablet+, the modal's width is 80%, so 10% margin on each side: @media #{$medium-up} { margin: 4vh 10% 0; // Restore a gap at the top, too. } // Modal's max width is 70em, so from min-width: (1.25 * 70em) we use math: @media only screen and (min-width: 87.5em) { margin: 4vh calc( (100% - 70em) / 2 ) 0; } // And then there's the height. On desktop/tablet, we want to fit the whole // modal on screen and keep the controls in view, with the icon grid // scrolling independently. Only bother with this on browsers w/ non-buggy // flexbox; on old browsers it can just act like it does on mobile. @media #{$medium-up} { // @supports will hide this from IE11, which thinks it can flex but kinda can't. @supports (display: flex) { .icon-browser-flex-wrapper { display: flex; flex-direction: column; max-height: calc(93vh - 3.75rem); // outer container has 1.875rem padding // This should usually leave 3vw gap at bottom, to reassure you that // you're seeing the whole thing and/or leave room for the // horizontal scrollbar. } .icon-browser-content { overflow-y: auto; overflow-x: hidden; -webkit-overflow-scrolling: touch; } } } // Not necessary on site skin, but necessary in most journal styles. box-sizing: border-box; * { box-sizing: border-box; } #js-icon-browser-search { width: 8em; // don't stretch to 100% on site skin flex-grow: 1; @media (pointer: coarse) { font-size: 16px; // dramatic woodchuck repellent } } .icon-browser-content { padding: 4px; // don't clip tops/sides off the box shadows } li { @include single-transition(background-color); } hr { display: block; width: 100%; border-style: solid; border-width: 1px 0 0; } .top-controls { // @supports will hide this from IE11, which thinks it can flex but kinda can't. @supports (display: flex) { display: flex; flex-direction: row-reverse; flex-wrap: wrap; align-items: center; justify-content: space-around; } & > * { // for no-flex browsers display: inline-block; margin-right: 2em; @supports (display: flex) { margin-right: .4rem; margin-left: .4rem; } margin-top: 0; margin-bottom: 1rem; white-space: nowrap; } // Override ultra-fluffy Foundation styling for fieldsets, we don't have // space for that nonsense. fieldset { padding: .3em .8em .6em; } } // Stash the options toggles out of the way on mobile #icon-browser-options-visibility { display: none; } @media #{$small-only} { #icon-browser-options-visibility { display: block; } &:not(.show-options) { .top-controls fieldset { display: none; } } &.show-options { #icon-browser-options-visibility img { transform: rotate(90deg); } } } // Make the toggle button summarize the current options .icon-browser-options-summary-small {display: none;} .icon-browser-options-summary-no-meta {display: none;} .icon-browser-options-summary-keyword {display: none;} &.small-icons { .icon-browser-options-summary-large {display: none;} .icon-browser-options-summary-small {display: inline;} } &.no-meta { .icon-browser-options-summary-meta {display: none;} .icon-browser-options-summary-no-meta {display: inline;} } &.keyword-order { .icon-browser-options-summary-date {display: none;} .icon-browser-options-summary-keyword {display: inline;} } p.icon-browser-help { font-size: smaller; margin-bottom: 1rem; } // Style reset for icon/keyword buttons button { display: block; border: none; margin: 0; padding: 0; background: none; border-radius: initial; box-shadow: none; color: inherit; text-align: inherit; font-size: inherit; font-weight: inherit; text-decoration: inherit; line-height: inherit; } // Hack: We wrap buttons in a dummy 'a' element to grab an appropriate color // for controls, so we can fit in on journal styles while still being // accessible. a.color-wrapper { display: block; text-decoration: none; } // Styles specifically for keyword buttons .keyword { display: block; width: 100%; cursor: pointer; text-decoration: none; border-width: 1px; border-style: solid; margin: 0 0 .2em; padding: calc(.1em + 2px) calc(.3em + 2px); // Don't change size when border changes line-height: 1.5; transition-duration: 300ms; transition-timing-function: ease-out; transition-property: color, background-color; } a.active .keyword { // Journal styles don't know about site skins' "a.active" controls so // they don't do the inverted colors thing. But border thickness will do // in a pinch. border-width: 3px; padding: .1em .3em; } .icon-browser-item-meta { word-wrap: break-word; overflow-wrap: break-word; min-width: 0; // makes children shrinkable by grid/flex font-size: smaller; } &.no-meta { .icon-browser-item-meta { display: none; } } // The image is wrapped in a dummy "a" element, so we can use inherit to // grab a color that fits the journal style. .th.active { border-color: inherit; } // Main grid .js-icon-browser-icon-grid { list-style: none; padding: 0; padding-bottom: 3rem; margin: 0; display: grid; grid-auto-flow: row dense; grid-template-columns: repeat(auto-fill, 110px); justify-content: center; grid-column-gap: 1rem; grid-row-gap: 1rem; li { list-style: none; margin: 0; // Basic fallback styles for old browsers: display: inline-block; width: 150px; vertical-align: top; padding-bottom: 1rem; padding-right: 1rem; // Cool browsers can ignore all that. @supports (display: grid) { width: auto; vertical-align: initial; padding: 0; } } } // Per-item grid .icon-browser-item { display: grid; grid-template-columns: 1fr; grid-template-rows: 108px 1fr; grid-row-gap: .5em; grid-column-gap: .5em; } // Icons sit on the ground, centered. .icon-browser-icon-image { align-self: end; justify-self: center; // Fallback for non-grid browsers margin-bottom: .5em; @supports (display: grid) { margin-bottom: 0; } } // Large + notext: get rid of extra vertical gap &.no-meta { .icon-browser-item { grid-row-gap: 0; } } // Small + text: Bigger cell width, icon beside text. &.small-icons { .js-icon-browser-icon-grid { grid-template-columns: repeat(auto-fill, 180px); } .icon-browser-item { grid-template-columns: 58px 1fr; grid-template-rows: 1fr; } // Icon aligns w/ start of text. .icon-browser-icon-image { align-self: start; } } // small + notext: shrink main grid, item grid adjusts fine. &.small-icons.no-meta { .js-icon-browser-icon-grid { grid-template-columns: repeat(auto-fill, 58px); } // Icons can sit on the ground again. .icon-browser-item { grid-template-rows: minmax(58px, 1fr); } .icon-browser-icon-image { align-self: end; justify-self: center; } } .icon-browser-icon-image { a { cursor: pointer; // since it has no href. // Don't save useless space below the image: display: block; line-height: 0; } img { max-width: 100%; height: auto; // Foundation's .th thumbnail class sets images to display: inline-block // instead of inline, which makes border-box sizing affect their // height/width attributes. So without this, a 100 x 100 icon will // display as 92 x 92. box-sizing: content-box; } } &.small-icons { .icon-browser-icon-image img { max-width: 58px; // 50px icon plus borders max-height: 58px; width: auto; // ...but once we're shrinking images anyway, reliable sizing // becomes more important than pixel-for-pixel dimensions. box-sizing: border-box; } } }