a3dfde5cec
* conversion stage 1 * correct image paths * add sidebar title to frontmatter * docs/concepts and docs/internals * configuration docs and multi-level nav corrections * commands docs, index file corrections, small item nav correction * secrets converted * auth * add enterprise and agent docs * add extra dividers * secret section, wip * correct sidebar nav title in front matter for apu section, start working on api items * auth and backend, a couple directory structure fixes * remove old docs * intro side nav converted * reset sidebar styles, add hashi-global-styles * basic styling for nav sidebar * folder collapse functionality * patch up border length on last list item * wip restructure for content component * taking middleman hacking to the extreme, but its working * small css fix * add new mega nav * fix a small mistake from the rebase * fix a content resolution issue with middleman * title a couple missing docs pages * update deps, remove temporary markup * community page * footer to layout, community page css adjustments * wip downloads page * deps updated, downloads page ready * fix community page * homepage progress * add components, adjust spacing * docs and api landing pages * a bunch of fixes, add docs and api landing pages * update deps, add deploy scripts * add readme note * update deploy command * overview page, index title * Update doc fields Note this still requires the link fields to be populated -- this is solely related to copy on the description fields * Update api_basic_categories.yml Updated API category descriptions. Like the document descriptions you'll still need to update the link headers to the proper target pages. * Add bottom hero, adjust CSS, responsive friendly * Add mega nav title * homepage adjustments, asset boosts * small fixes * docs page styling fixes * meganav title * some category link corrections * Update API categories page updated to reflect the second level headings for api categories * Update docs_detailed_categories.yml Updated to represent the existing docs structure * Update docs_detailed_categories.yml * docs page data fix, extra operator page remove * api data fix * fix makefile * update deps, add product subnav to docs and api landing pages * Rearrange non-hands-on guides to _docs_ Since there is no place for these on learn.hashicorp, we'll put them under _docs_. * WIP Redirects for guides to docs * content and component updates * font weight hotfix, redirects * fix guides and intro sidenavs * fix some redirects * small style tweaks * Redirects to learn and internally to docs * Remove redirect to `/vault` * Remove `.html` from destination on redirects * fix incorrect index redirect * final touchups * address feedback from michell for makefile and product downloads
71 lines
1.9 KiB
JavaScript
71 lines
1.9 KiB
JavaScript
import { render } from 'preact'
|
|
import { hydrateInitialState } from 'reshape-preact-components/lib/browser'
|
|
|
|
// rehydrates and initializes top-level preact components
|
|
export function initializeComponents(obj) {
|
|
const res = {}
|
|
|
|
for (let k in obj) {
|
|
const name = getName(k)
|
|
res[name] = []
|
|
each(document.querySelectorAll(`.g-${name}`), el => {
|
|
// do not initialize nested components
|
|
const matches = Object.keys(obj)
|
|
.map(getName)
|
|
.reduce((m, name) => {
|
|
const parent = findParent(el, `.g-${name}`)
|
|
if (parent) m.push(parent)
|
|
return m
|
|
}, [])
|
|
if (matches.length > 1) return
|
|
// if there's no data-state, don't try
|
|
if (!el.dataset.state || !el.dataset.state.length) {
|
|
return
|
|
}
|
|
// otherwise, initialize away
|
|
const vdom = hydrateInitialState(el.dataset.state, {
|
|
[`hashi-${name}`]: obj[k]
|
|
})
|
|
|
|
res[name].push(render(vdom, el.parentElement, el))
|
|
})
|
|
}
|
|
|
|
return res
|
|
|
|
function getName(s) {
|
|
return s.replace(/([A-Z])/g, '-$1').toLowerCase()
|
|
}
|
|
}
|
|
|
|
// iterates through a NodeList
|
|
export function each(list, cb) {
|
|
for (let i = 0; i < list.length; i++) {
|
|
cb(list[i], i)
|
|
}
|
|
}
|
|
|
|
// polyfills object-fit in unsupported browsers
|
|
export function fixObjectFit() {
|
|
if (Modernizr.objectfit) {
|
|
import('object-fit-images').then(ofi => {
|
|
ofi.default()
|
|
})
|
|
}
|
|
}
|
|
|
|
// given an element and selector, finds the closest parent element. doesn't
|
|
// handle attribute selectors, just class, id, and element name
|
|
export function findParent(el, selector) {
|
|
const firstChar = selector[0]
|
|
if (firstChar === '.') {
|
|
if (el.classList.contains(selector.substr(1))) return el
|
|
} else if (firstChar === '#') {
|
|
if (el.id === selector.substr(1)) return el
|
|
} else {
|
|
if (el.tagName.toLowerCase() === selector) return el
|
|
}
|
|
if (!el.parentNode.tagName) return undefined
|
|
return findParent(el.parentNode, selector)
|
|
}
|