import { RibbonConfig, RibbonSection, RibbonTab } from "../../core/types/ribbon.types";
interface State {
config: RibbonConfig;
}
const defaultState: State = {
config: { }
};
const generateTemplate = (state: State): string => {
return `
${ generateTabs(state.config) }
`;
}
const generateHeader = (config: RibbonConfig): string => {
if (!config?.tabs) { return ''; }
let template = '';
for (const tab of config.tabs) {
template += ``
}
return template;
}
const generateTabs = (config: RibbonConfig): string => {
if (!config?.tabs) { return '' }
let template = '';
for (const tab of config.tabs) {
if (tab.active) {
template += `
${ generateSections(tab) }
`
}
}
return template;
}
const generateSections = (tab: RibbonTab): string => {
let template = '';
for (const section of tab.sections) {
template += `
${ generateControls(section) }
${ section.label }
`;
}
return template;
}
const generateControls = (section: RibbonSection): string => {
if (!section.controls) { return ''; }
let template = '';
for (const control of section.controls) {
template += `
`;
}
return template;
}
const generateStyle = (): string => {
return `
.ribbon-section, .tab-header, .tab-content {
position: relative;
display: flex;
}
.tab-header {
background-color: var(--app-color);
}
.btn {
background-color: transparent;
border: none;
outline: 0;
}
.tab-btn {
color: var(--app-color-text-color);
padding: var(--space-md) var(--space-lg);
}
.tab-btn.active {
background-color: var(--muted-bg-color);
color: var(--color);
border-radius: 5px 5px 0 0;
}
.tab-content {
background-color: var(--muted-bg-color);
padding: var(--space-md) 0;
min-height: 100px;
}
.ribbon-section {
flex-direction: column;
padding: 0 var(--space-lg);
justify-content: space-between;
height: 100px;
gap: var(--space-sm);
}
.ribbon-section-content {
flex: 1;
}
.ribbon-section-content,
.single.control,
.row.control,
.col.control {
display: flex;
gap: var(--space-md);
}
.ribbon-section-content.single {
justify-items: center;
}
.control {
border: 1px solid transparent;
}
.control:hover {
border-color: var(--muted-fg-color);
}
.single.control,
.row.control {
align-items: center;
}
.single.control .icon,
.row.control .icon {
font-size: 2.5rem;
}
.ribbon-section-content.col,
.single.control,
.row.control {
flex-direction: column;
}
.ribbon-section-label {
color: var(--muted-fg-color);
font-size: .8rem;
text-align: center;
flex: 0 0 auto;
}
.ribbon-separator {
width: 1px;
background-color: var(--muted-fg-color);
}
@media (max-width: 600px) {
.tab-header, .tab-content {
display: none;
}
}
`;
};
export {
defaultState,
generateTemplate,
generateStyle,
State
};