<script>
import { Menu } from '@bootstrap'
+ import { highlightCode } from '@libs/highlight'
const colorMenuButton = document.querySelector('#btn-color-menu') as HTMLButtonElement
const colorMenuItems = document.querySelectorAll('#btn-color-menu + .menu .menu-item')
const styleInputs = document.querySelectorAll('input[name="btn-style"]')
const roundedInputs = document.querySelectorAll('input[name="btn-rounded"]')
const previewButtons = document.querySelectorAll('#button-preview button')
- // Find the code snippet inside the Example component
- const codeSnippet = document
+ // Find the code snippet pre element inside the Example component
+ let codeSnippetPre = document
.querySelector('#button-preview')
?.closest('.bd-example-snippet')
- ?.querySelector('.highlight code') as HTMLElement
+ ?.querySelector('.astro-code') as HTMLElement | null
// Get all theme color names for removal
const themeColorNames = Array.from(colorMenuItems).map((item) => (item as HTMLElement).dataset.color || '')
return html
}
- function updateCodeSnippet() {
- if (!codeSnippet) return
+ async function updateCodeSnippet() {
+ if (!codeSnippetPre) return
const htmlSnippets = Array.from(previewButtons).map((button) => generateHTML(button as HTMLElement))
const htmlCode = htmlSnippets.join('\n\n')
- // Update the code content
- codeSnippet.className = 'language-html'
- codeSnippet.textContent = htmlCode
+ const highlighted = await highlightCode(htmlCode, 'html')
+ const parser = new DOMParser()
+ const doc = parser.parseFromString(highlighted, 'text/html')
+ const newPre = doc.querySelector('pre')
+ if (newPre) {
+ codeSnippetPre.replaceWith(newPre)
+ codeSnippetPre = newPre
+ }
}
function updateButtons() {
<script>
import { Menu } from '@bootstrap'
+ import { highlightCode } from '@libs/highlight'
const selectorButton = document.querySelector('#menu-placement-selector') as HTMLButtonElement
const selectorItems = document.querySelectorAll('#menu-placement-selector-menu .menu-item')
const placementTypeInputs = document.querySelectorAll('input[name="menu-placement-type"]')
const previewContainer = document.querySelector('#menu-placement-preview')
const previewToggle = previewContainer?.querySelector('[data-bs-toggle="menu"]') as HTMLButtonElement
- const codeSnippet = previewContainer?.closest('.bd-example-snippet')?.querySelector('.highlight code') as HTMLElement
+ let codeSnippetPre = previewContainer
+ ?.closest('.bd-example-snippet')
+ ?.querySelector('.astro-code') as HTMLElement | null
function updateSelectorItems() {
const selectedType =
updateCodeSnippet(placement)
}
- function updateCodeSnippet(placement: string) {
- if (!codeSnippet) return
+ async function updateCodeSnippet(placement: string) {
+ if (!codeSnippetPre) return
const htmlCode = `<button class="btn-solid theme-primary" type="button" data-bs-toggle="menu" data-bs-placement="${placement}" aria-expanded="false">
Toggle menu
<button class="menu-item" type="button">Something else here</button>
</div>`
- codeSnippet.className = 'language-html'
- codeSnippet.textContent = htmlCode
+ const highlighted = await highlightCode(htmlCode, 'html')
+ const parser = new DOMParser()
+ const doc = parser.parseFromString(highlighted, 'text/html')
+ const newPre = doc.querySelector('pre')
+ if (newPre) {
+ codeSnippetPre.replaceWith(newPre)
+ codeSnippetPre = newPre
+ }
}
if (selectorButton) {
<script>
import { Menu } from '@bootstrap'
+ import { highlightCode } from '@libs/highlight'
const placementMenuButton = document.querySelector('#navbar-placement-menu') as HTMLButtonElement
const placementMenuItems = document.querySelectorAll('#navbar-placement-menu + .menu .menu-item')
const previewContainer = document.querySelector('#navbar-placement-preview') as HTMLElement
const previewNavbar = previewContainer?.querySelector('.navbar') as HTMLElement
- const codeSnippet = previewContainer?.closest('.bd-example-snippet')?.querySelector('.highlight code') as HTMLElement
+ let codeSnippetPre = previewContainer
+ ?.closest('.bd-example-snippet')
+ ?.querySelector('.astro-code') as HTMLElement | null
const placementClasses = ['fixed-top', 'fixed-bottom', 'sticky-top', 'sticky-bottom']
updateCodeSnippet(placement)
}
- function updateCodeSnippet(placement: string) {
- if (!codeSnippet) return
+ async function updateCodeSnippet(placement: string) {
+ if (!codeSnippetPre) return
const placementClass = placement ? ` ${placement}` : ''
const label = placementLabels[placement] || 'Default'
</div>
</nav>`
- codeSnippet.className = 'language-html'
- codeSnippet.textContent = htmlCode
+ const highlighted = await highlightCode(htmlCode, 'html')
+ const parser = new DOMParser()
+ const doc = parser.parseFromString(highlighted, 'text/html')
+ const newPre = doc.querySelector('pre')
+ if (newPre) {
+ codeSnippetPre.replaceWith(newPre)
+ codeSnippetPre = newPre
+ }
}
if (placementMenuButton) {
display: none;
float: inline-end;
- // + .highlight {
- // margin-top: 0;
- // }
-
@include media-breakpoint-up(md) {
display: block;
}
// Code snippets
//
- .bd-example-snippet .highlight pre {
- margin-inline-end: 0;
- }
-
-
.bd-colors-grid {
grid-template-columns: repeat(7, 1fr);
gap: 4px;
color: var(--bs-fg-3);
}
- .bd-code-snippet {
- margin: 0;
- border-color: var(--bs-border-color-translucent);
- border-width: 1px;
- @include border-radius(.5rem);
- }
-
- .highlight {
- width: 100%;
- padding: .5rem 1rem;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- background-color: color-mix(in oklch, var(--bs-fg-body) #{math.percentage(.075)}, transparent);
- @include border-radius(calc(.5rem - 1px));
-
- @include media-breakpoint-up(lg) {
- padding-inline-end: 4rem;
- }
-
- pre {
- padding: 0;
- margin: .625rem 0;
- overflow: hidden;
- }
- }
.btn-clipboard {
position: absolute;
top: -.625rem;