2024-01-18 17:23:50 +00:00
|
|
|
import {textarea} from 'app/client/ui/inputs';
|
2023-12-12 09:58:20 +00:00
|
|
|
import {sanitizeHTML} from 'app/client/ui/sanitizeHTML';
|
2024-03-20 14:51:59 +00:00
|
|
|
import {basicButton, basicButtonLink, textButton} from 'app/client/ui2018/buttons';
|
2024-04-11 06:50:30 +00:00
|
|
|
import {cssLabel} from 'app/client/ui2018/checkbox';
|
2024-01-24 09:58:19 +00:00
|
|
|
import {colors, theme} from 'app/client/ui2018/cssVars';
|
2024-01-18 17:23:50 +00:00
|
|
|
import {icon} from 'app/client/ui2018/icons';
|
2024-04-11 06:50:30 +00:00
|
|
|
import {numericSpinner} from 'app/client/widgets/NumericSpinner';
|
2024-01-18 17:23:50 +00:00
|
|
|
import {BindableValue, dom, DomElementArg, IDomArgs, Observable, styled, subscribeBindable} from 'grainjs';
|
2023-12-12 09:58:20 +00:00
|
|
|
import {marked} from 'marked';
|
|
|
|
|
2024-01-18 17:23:50 +00:00
|
|
|
export const cssFormView = styled('div.flexauto.flexvbox', `
|
2023-12-12 09:58:20 +00:00
|
|
|
color: ${theme.text};
|
|
|
|
display: flex;
|
|
|
|
flex-direction: column;
|
|
|
|
flex-basis: 0px;
|
|
|
|
align-items: center;
|
2024-01-12 17:35:24 +00:00
|
|
|
justify-content: space-between;
|
2023-12-12 09:58:20 +00:00
|
|
|
position: relative;
|
2024-01-18 17:23:50 +00:00
|
|
|
overflow: auto;
|
|
|
|
min-height: 100%;
|
|
|
|
width: 100%;
|
|
|
|
`);
|
2023-12-12 09:58:20 +00:00
|
|
|
|
2024-01-18 17:23:50 +00:00
|
|
|
export const cssFormContainer = styled('div', `
|
|
|
|
background-color: ${theme.mainPanelBg};
|
|
|
|
color: ${theme.text};
|
|
|
|
width: 600px;
|
|
|
|
align-self: center;
|
|
|
|
margin: 0px auto;
|
|
|
|
border-radius: 3px;
|
|
|
|
display: flex;
|
|
|
|
flex-direction: column;
|
|
|
|
max-width: calc(100% - 32px);
|
|
|
|
gap: 8px;
|
2024-04-11 06:50:30 +00:00
|
|
|
line-height: 1.42857143;
|
2024-01-18 17:23:50 +00:00
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssFieldEditor = styled('div.hover_border.field_editor', `
|
|
|
|
position: relative;
|
|
|
|
cursor: pointer;
|
|
|
|
user-select: none;
|
|
|
|
outline: none;
|
|
|
|
padding: 8px;
|
|
|
|
border-radius: 3px;
|
|
|
|
margin-bottom: 4px;
|
|
|
|
--hover-visible: hidden;
|
|
|
|
transition: transform 0.2s ease-in-out;
|
2024-04-11 06:50:30 +00:00
|
|
|
&-Section {
|
|
|
|
outline: 1px solid ${theme.modalBorderDark};
|
|
|
|
margin-bottom: 24px;
|
|
|
|
padding: 16px;
|
|
|
|
}
|
2024-01-18 17:23:50 +00:00
|
|
|
&:hover:not(:has(.hover_border:hover),&-cut) {
|
|
|
|
--hover-visible: visible;
|
2024-01-24 09:58:19 +00:00
|
|
|
outline: 1px solid ${theme.controlPrimaryBg};
|
2024-01-18 17:23:50 +00:00
|
|
|
}
|
|
|
|
&-selected:not(&-cut) {
|
2024-01-24 09:58:19 +00:00
|
|
|
background: ${theme.lightHover};
|
|
|
|
outline: 1px solid ${theme.controlPrimaryBg};
|
2024-01-18 17:23:50 +00:00
|
|
|
--selected-block: block;
|
|
|
|
}
|
|
|
|
&:active:not(:has(&:active)) {
|
2024-01-24 09:58:19 +00:00
|
|
|
outline: 1px solid ${theme.controlPrimaryHoverBg};
|
2024-01-18 17:23:50 +00:00
|
|
|
}
|
|
|
|
&-drag-hover {
|
2024-01-24 09:58:19 +00:00
|
|
|
outline: 2px dashed ${theme.controlPrimaryBg};
|
2024-01-18 17:23:50 +00:00
|
|
|
outline-offset: 2px;
|
|
|
|
}
|
|
|
|
&-cut {
|
|
|
|
outline: 2px dashed ${colors.orange};
|
|
|
|
outline-offset: 2px;
|
|
|
|
}
|
|
|
|
&-FormDescription {
|
|
|
|
margin-bottom: 10px;
|
|
|
|
}
|
|
|
|
&-drag-above {
|
|
|
|
transform: translateY(2px);
|
2023-12-12 09:58:20 +00:00
|
|
|
}
|
2024-01-18 17:23:50 +00:00
|
|
|
&-drag-below {
|
|
|
|
transform: translateY(-2px);
|
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssSection = styled('div', `
|
|
|
|
position: relative;
|
|
|
|
color: ${theme.text};
|
|
|
|
margin: 0px auto;
|
|
|
|
min-height: 50px;
|
2024-04-11 06:50:30 +00:00
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssCheckboxList = styled('div', `
|
|
|
|
display: flex;
|
|
|
|
flex-direction: column;
|
|
|
|
gap: 8px;
|
|
|
|
|
|
|
|
&-horizontal {
|
|
|
|
flex-direction: row;
|
|
|
|
flex-wrap: wrap;
|
|
|
|
column-gap: 16px;
|
2024-01-18 17:23:50 +00:00
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
2024-04-11 06:50:30 +00:00
|
|
|
export const cssCheckboxLabel = styled(cssLabel, `
|
|
|
|
font-size: 13px;
|
|
|
|
line-height: 16px;
|
2024-01-18 17:23:50 +00:00
|
|
|
font-weight: normal;
|
|
|
|
user-select: none;
|
|
|
|
display: flex;
|
|
|
|
gap: 8px;
|
|
|
|
margin: 0px;
|
2024-04-11 06:50:30 +00:00
|
|
|
overflow-wrap: anywhere;
|
2023-12-12 09:58:20 +00:00
|
|
|
`);
|
|
|
|
|
2024-04-11 06:50:30 +00:00
|
|
|
export const cssRadioList = cssCheckboxList;
|
|
|
|
|
|
|
|
export const cssRadioLabel = cssCheckboxLabel;
|
|
|
|
|
2024-01-18 17:23:50 +00:00
|
|
|
export function textbox(obs: Observable<string|undefined>, ...args: DomElementArg[]): HTMLInputElement {
|
|
|
|
return dom('input',
|
|
|
|
dom.prop('value', u => u(obs) || ''),
|
|
|
|
dom.on('input', (_e, elem) => obs.set(elem.value)),
|
|
|
|
...args,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2024-01-24 16:14:34 +00:00
|
|
|
export const cssQuestion = styled('div', `
|
2024-04-11 06:50:30 +00:00
|
|
|
height: 100%;
|
|
|
|
display: flex;
|
|
|
|
flex-direction: column;
|
|
|
|
justify-content: space-between;
|
2024-01-24 16:14:34 +00:00
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssRequiredWrapper = styled('div', `
|
2024-04-11 06:50:30 +00:00
|
|
|
margin: 8px 0px;
|
2024-01-24 16:14:34 +00:00
|
|
|
min-height: 16px;
|
2024-04-12 17:00:05 +00:00
|
|
|
overflow-wrap: break-word;
|
|
|
|
|
2024-01-24 16:14:34 +00:00
|
|
|
&-required {
|
|
|
|
display: grid;
|
|
|
|
grid-template-columns: auto 1fr;
|
|
|
|
gap: 4px;
|
|
|
|
}
|
|
|
|
&-required:after {
|
|
|
|
content: "*";
|
|
|
|
color: ${colors.lightGreen};
|
|
|
|
font-size: 11px;
|
|
|
|
font-weight: 700;
|
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssRenderedLabel = styled('div', `
|
|
|
|
font-weight: normal;
|
|
|
|
padding: 0px;
|
|
|
|
border: 0px;
|
|
|
|
width: 100%;
|
|
|
|
margin: 0px;
|
|
|
|
background: transparent;
|
|
|
|
cursor: pointer;
|
|
|
|
min-height: 16px;
|
|
|
|
|
2024-02-14 21:18:09 +00:00
|
|
|
color: ${theme.mediumText};
|
2024-04-11 06:50:30 +00:00
|
|
|
font-size: 13px;
|
2024-01-24 16:14:34 +00:00
|
|
|
line-height: 16px;
|
|
|
|
font-weight: 700;
|
|
|
|
white-space: pre-wrap;
|
|
|
|
&-placeholder {
|
|
|
|
font-style: italic
|
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
2024-01-18 17:23:50 +00:00
|
|
|
export const cssEditableLabel = styled(textarea, `
|
|
|
|
font-weight: normal;
|
|
|
|
outline: none;
|
|
|
|
display: block;
|
|
|
|
padding: 0px;
|
|
|
|
border: 0px;
|
|
|
|
width: 100%;
|
|
|
|
margin: 0px;
|
|
|
|
background: transparent;
|
|
|
|
cursor: pointer;
|
|
|
|
min-height: 1.5rem;
|
|
|
|
|
2024-01-24 09:58:19 +00:00
|
|
|
color: ${theme.mediumText};
|
2024-01-18 17:23:50 +00:00
|
|
|
font-size: 12px;
|
|
|
|
font-weight: 700;
|
|
|
|
|
|
|
|
&::placeholder {
|
|
|
|
font-style: italic
|
|
|
|
}
|
|
|
|
&-edit {
|
|
|
|
cursor: auto;
|
|
|
|
background: ${theme.inputBg};
|
2024-01-24 09:58:19 +00:00
|
|
|
outline: 2px solid ${theme.accessRulesFormulaEditorFocus};
|
2024-01-18 17:23:50 +00:00
|
|
|
outline-offset: 1px;
|
|
|
|
border-radius: 2px;
|
|
|
|
}
|
2024-01-24 16:14:34 +00:00
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssLabelInline = styled('div', `
|
2024-04-11 06:50:30 +00:00
|
|
|
line-height: 16px;
|
|
|
|
margin: 0px;
|
|
|
|
overflow-wrap: anywhere;
|
2024-01-18 17:23:50 +00:00
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssDesc = styled('div', `
|
|
|
|
font-size: 12px;
|
2023-12-12 09:58:20 +00:00
|
|
|
font-weight: 400;
|
|
|
|
margin-top: 4px;
|
2024-01-18 17:23:50 +00:00
|
|
|
color: ${theme.darkText};
|
2023-12-12 09:58:20 +00:00
|
|
|
white-space: pre-wrap;
|
2024-01-18 17:23:50 +00:00
|
|
|
font-style: italic;
|
|
|
|
font-weight: 400;
|
|
|
|
line-height: 1.6;
|
2023-12-12 09:58:20 +00:00
|
|
|
`);
|
|
|
|
|
2024-01-18 17:23:50 +00:00
|
|
|
export const cssInput = styled('input', `
|
2024-04-11 06:50:30 +00:00
|
|
|
background-color: ${theme.inputBg};
|
2023-12-12 09:58:20 +00:00
|
|
|
font-size: inherit;
|
2024-04-11 06:50:30 +00:00
|
|
|
height: 29px;
|
2023-12-12 09:58:20 +00:00
|
|
|
padding: 4px 8px;
|
2024-01-24 09:58:19 +00:00
|
|
|
border: 1px solid ${theme.inputBorder};
|
2023-12-12 09:58:20 +00:00
|
|
|
border-radius: 3px;
|
|
|
|
outline: none;
|
2024-01-24 09:58:19 +00:00
|
|
|
pointer-events: none;
|
2023-12-12 09:58:20 +00:00
|
|
|
|
2024-04-11 06:50:30 +00:00
|
|
|
&:disabled {
|
|
|
|
color: ${theme.inputDisabledFg};
|
|
|
|
background-color: ${theme.inputDisabledBg};
|
|
|
|
}
|
2023-12-12 09:58:20 +00:00
|
|
|
&-invalid {
|
2024-01-24 09:58:19 +00:00
|
|
|
color: ${theme.inputInvalid};
|
2023-12-12 09:58:20 +00:00
|
|
|
}
|
2024-01-18 17:23:50 +00:00
|
|
|
&[type="number"], &[type="date"], &[type="datetime-local"], &[type="text"] {
|
|
|
|
width: 100%;
|
|
|
|
}
|
2023-12-12 09:58:20 +00:00
|
|
|
`);
|
|
|
|
|
2024-04-11 06:50:30 +00:00
|
|
|
export const cssTextArea = styled('textarea', `
|
|
|
|
background-color: ${theme.inputBg};
|
|
|
|
font-size: inherit;
|
|
|
|
min-height: 29px;
|
|
|
|
padding: 4px 8px;
|
|
|
|
border: 1px solid ${theme.inputBorder};
|
|
|
|
border-radius: 3px;
|
|
|
|
outline: none;
|
|
|
|
pointer-events: none;
|
|
|
|
resize: none;
|
|
|
|
width: 100%;
|
|
|
|
|
|
|
|
&:disabled {
|
|
|
|
color: ${theme.inputDisabledFg};
|
|
|
|
background-color: ${theme.inputDisabledBg};
|
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssSpinner = styled(numericSpinner, `
|
|
|
|
height: 29px;
|
|
|
|
|
|
|
|
&-hidden {
|
|
|
|
color: ${theme.inputDisabledFg};
|
|
|
|
background-color: ${theme.inputDisabledBg};
|
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
2023-12-12 09:58:20 +00:00
|
|
|
export const cssSelect = styled('select', `
|
|
|
|
flex: auto;
|
|
|
|
width: 100%;
|
2024-04-11 06:50:30 +00:00
|
|
|
background-color: ${theme.inputBg};
|
2023-12-12 09:58:20 +00:00
|
|
|
font-size: inherit;
|
2024-02-14 21:18:09 +00:00
|
|
|
height: 27px;
|
2023-12-12 09:58:20 +00:00
|
|
|
padding: 4px 8px;
|
2024-01-24 09:58:19 +00:00
|
|
|
border: 1px solid ${theme.inputBorder};
|
2023-12-12 09:58:20 +00:00
|
|
|
border-radius: 3px;
|
|
|
|
outline: none;
|
2024-01-24 09:58:19 +00:00
|
|
|
pointer-events: none;
|
2023-12-12 09:58:20 +00:00
|
|
|
`);
|
|
|
|
|
2024-04-11 06:50:30 +00:00
|
|
|
export const cssToggle = styled('div', `
|
|
|
|
display: grid;
|
|
|
|
grid-template-columns: auto 1fr;
|
|
|
|
margin-top: 12px;
|
|
|
|
gap: 8px;
|
|
|
|
--grist-actual-cell-color: ${colors.lightGreen};
|
|
|
|
`);
|
2024-01-18 17:23:50 +00:00
|
|
|
|
2024-04-11 06:50:30 +00:00
|
|
|
export const cssWidgetSwitch = styled('div.widget_switch', `
|
|
|
|
&-hidden {
|
|
|
|
opacity: 0.6;
|
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssWarningMessage = styled('div', `
|
|
|
|
margin-top: 8px;
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
column-gap: 8px;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssWarningIcon = styled(icon, `
|
|
|
|
--icon-color: ${colors.warning};
|
|
|
|
flex-shrink: 0;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssFieldEditorContent = styled('div', `
|
|
|
|
height: 100%;
|
2023-12-12 09:58:20 +00:00
|
|
|
`);
|
|
|
|
|
2024-01-18 17:23:50 +00:00
|
|
|
export const cssSelectedOverlay = styled('div._cssSelectedOverlay', `
|
2023-12-12 09:58:20 +00:00
|
|
|
inset: 0;
|
|
|
|
position: absolute;
|
|
|
|
opacity: 0;
|
|
|
|
outline: none;
|
|
|
|
.${cssFieldEditor.className}-selected > & {
|
|
|
|
opacity: 1;
|
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
2024-01-18 17:23:50 +00:00
|
|
|
export const cssPlusButton = styled('div', `
|
2023-12-12 09:58:20 +00:00
|
|
|
position: relative;
|
|
|
|
min-height: 32px;
|
|
|
|
cursor: pointer;
|
|
|
|
display: flex;
|
|
|
|
justify-content: center;
|
|
|
|
align-items: center;
|
2024-01-18 17:23:50 +00:00
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssCircle = styled('div', `
|
|
|
|
border-radius: 50%;
|
|
|
|
width: 24px;
|
|
|
|
height: 24px;
|
2024-01-24 09:58:19 +00:00
|
|
|
background-color: ${theme.addNewCircleSmallBg};
|
|
|
|
color: ${theme.addNewCircleSmallFg};
|
2024-01-18 17:23:50 +00:00
|
|
|
display: flex;
|
|
|
|
justify-content: center;
|
|
|
|
align-items: center;
|
|
|
|
.${cssPlusButton.className}:hover & {
|
2024-01-24 09:58:19 +00:00
|
|
|
background: ${theme.addNewCircleSmallHoverBg};
|
2023-12-12 09:58:20 +00:00
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
2024-01-18 17:23:50 +00:00
|
|
|
export const cssPlusIcon = styled(icon, `
|
2024-01-24 09:58:19 +00:00
|
|
|
--icon-color: ${theme.controlPrimaryFg};
|
2023-12-12 09:58:20 +00:00
|
|
|
`);
|
|
|
|
|
|
|
|
|
|
|
|
export const cssColumns = styled('div', `
|
|
|
|
display: grid;
|
|
|
|
grid-template-columns: repeat(var(--css-columns-count), 1fr) 32px;
|
|
|
|
gap: 8px;
|
2024-01-24 16:14:34 +00:00
|
|
|
padding: 8px 4px;
|
2023-12-12 09:58:20 +00:00
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssColumn = styled('div', `
|
|
|
|
position: relative;
|
|
|
|
&-empty, &-add-button {
|
|
|
|
position: relative;
|
|
|
|
min-height: 32px;
|
|
|
|
cursor: pointer;
|
|
|
|
display: flex;
|
|
|
|
justify-content: center;
|
|
|
|
align-items: center;
|
|
|
|
padding-right: 8px;
|
2024-01-24 09:58:19 +00:00
|
|
|
--icon-color: ${theme.lightText};
|
2023-12-12 09:58:20 +00:00
|
|
|
align-self: stretch;
|
|
|
|
transition: height 0.2s ease-in-out;
|
2024-01-24 09:58:19 +00:00
|
|
|
border: 2px dashed ${theme.inputBorder};
|
|
|
|
background: ${theme.lightHover};
|
|
|
|
color: ${theme.lightText};
|
2023-12-12 09:58:20 +00:00
|
|
|
border-radius: 4px;
|
|
|
|
padding: 2px 4px;
|
|
|
|
font-size: 12px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&-selected {
|
2024-01-24 09:58:19 +00:00
|
|
|
border: 2px dashed ${theme.lightText};
|
2023-12-12 09:58:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
&-empty:hover, &-add-button:hover {
|
2024-01-24 09:58:19 +00:00
|
|
|
border: 2px dashed ${theme.lightText};
|
2023-12-12 09:58:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
&-drag-over {
|
2024-01-24 09:58:19 +00:00
|
|
|
outline: 2px dashed ${theme.controlPrimaryBg};
|
2023-12-12 09:58:20 +00:00
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssButtonGroup = styled('div', `
|
|
|
|
display: flex;
|
2024-01-18 17:23:50 +00:00
|
|
|
align-items: center;
|
2024-01-12 17:35:24 +00:00
|
|
|
flex-wrap: wrap;
|
|
|
|
padding: 0px 24px 0px 24px;
|
2023-12-12 09:58:20 +00:00
|
|
|
gap: 8px;
|
2024-01-18 17:23:50 +00:00
|
|
|
/* So that the height is 40px in normal state */
|
|
|
|
padding-top: calc((40px - 24px) / 2);
|
|
|
|
padding-bottom: calc((40px - 24px) / 2);
|
|
|
|
`);
|
|
|
|
|
|
|
|
|
2024-03-20 14:51:59 +00:00
|
|
|
export const cssSmallLinkButton = styled(basicButtonLink, `
|
2024-05-10 12:54:37 +00:00
|
|
|
display: inline-flex;
|
2024-01-18 17:23:50 +00:00
|
|
|
align-items: center;
|
|
|
|
gap: 4px;
|
2024-03-20 14:51:59 +00:00
|
|
|
min-height: 26px;
|
2023-12-12 09:58:20 +00:00
|
|
|
`);
|
|
|
|
|
2024-03-20 14:51:59 +00:00
|
|
|
export const cssSmallButton = styled(basicButton, `
|
2024-01-24 09:58:19 +00:00
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
gap: 4px;
|
2024-03-20 14:51:59 +00:00
|
|
|
min-height: 26px;
|
2024-01-24 09:58:19 +00:00
|
|
|
|
|
|
|
&-frameless {
|
|
|
|
background-color: transparent;
|
|
|
|
border: none;
|
|
|
|
}
|
2024-01-12 17:35:24 +00:00
|
|
|
&-warning {
|
|
|
|
color: ${theme.controlPrimaryFg};
|
|
|
|
background-color: ${theme.toastWarningBg};
|
|
|
|
border: none;
|
|
|
|
}
|
|
|
|
&-warning:hover {
|
|
|
|
color: ${theme.controlPrimaryFg};
|
|
|
|
background-color: #B8791B;
|
|
|
|
border: none;
|
|
|
|
}
|
2023-12-12 09:58:20 +00:00
|
|
|
`);
|
|
|
|
|
2024-01-18 17:23:50 +00:00
|
|
|
export const cssMarkdownRendered = styled('div', `
|
2023-12-12 09:58:20 +00:00
|
|
|
min-height: 1.5rem;
|
2024-01-18 17:23:50 +00:00
|
|
|
font-size: 15px;
|
2024-04-12 17:00:05 +00:00
|
|
|
overflow-wrap: break-word;
|
|
|
|
|
2024-01-18 17:23:50 +00:00
|
|
|
& textarea {
|
|
|
|
font-size: 15px;
|
|
|
|
}
|
2024-01-24 09:58:19 +00:00
|
|
|
&-edit textarea {
|
|
|
|
outline: 2px solid ${theme.accessRulesFormulaEditorFocus};
|
|
|
|
}
|
2024-01-18 17:23:50 +00:00
|
|
|
& strong {
|
|
|
|
font-weight: 600;
|
|
|
|
}
|
|
|
|
&-alignment-left {
|
|
|
|
text-align: left;
|
|
|
|
}
|
|
|
|
&-alignment-center {
|
|
|
|
text-align: center;
|
|
|
|
}
|
|
|
|
&-alignment-right {
|
|
|
|
text-align: right;
|
|
|
|
}
|
|
|
|
& hr {
|
2024-01-24 09:58:19 +00:00
|
|
|
border-color: ${theme.inputBorder};
|
2024-01-18 17:23:50 +00:00
|
|
|
margin: 8px 0px;
|
|
|
|
}
|
|
|
|
&-separator {
|
|
|
|
display: flex;
|
|
|
|
flex-direction: column;
|
|
|
|
justify-content: center;
|
|
|
|
}
|
|
|
|
&-separator hr {
|
|
|
|
margin: 0px;
|
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssMarkdownRender = styled('div', `
|
|
|
|
& > p:last-child {
|
|
|
|
margin-bottom: 0px;
|
|
|
|
}
|
|
|
|
& h1 {
|
|
|
|
font-size: 24px;
|
|
|
|
margin: 4px 0px;
|
|
|
|
font-weight: normal;
|
|
|
|
}
|
|
|
|
& h2 {
|
|
|
|
font-size: 22px;
|
|
|
|
margin: 4px 0px;
|
|
|
|
font-weight: normal;
|
|
|
|
}
|
|
|
|
& h3 {
|
|
|
|
font-size: 16px;
|
|
|
|
margin: 4px 0px;
|
|
|
|
font-weight: normal;
|
|
|
|
}
|
|
|
|
& h4 {
|
|
|
|
font-size: 13px;
|
|
|
|
margin: 4px 0px;
|
|
|
|
font-weight: normal;
|
|
|
|
}
|
|
|
|
& h5 {
|
|
|
|
font-size: 11px;
|
|
|
|
margin: 4px 0px;
|
|
|
|
font-weight: normal;
|
|
|
|
}
|
|
|
|
& h6 {
|
|
|
|
font-size: 10px;
|
|
|
|
margin: 4px 0px;
|
|
|
|
font-weight: normal;
|
|
|
|
}
|
2023-12-12 09:58:20 +00:00
|
|
|
`);
|
|
|
|
|
|
|
|
export function markdown(obs: BindableValue<string>, ...args: IDomArgs<HTMLDivElement>) {
|
2024-01-18 17:23:50 +00:00
|
|
|
return cssMarkdownRender(el => {
|
2023-12-12 09:58:20 +00:00
|
|
|
dom.autoDisposeElem(el, subscribeBindable(obs, val => {
|
|
|
|
el.innerHTML = sanitizeHTML(marked(val));
|
|
|
|
}));
|
|
|
|
}, ...args);
|
|
|
|
}
|
|
|
|
|
2024-01-18 17:23:50 +00:00
|
|
|
export const cssDrop = styled('div.test-forms-drag', `
|
2023-12-12 09:58:20 +00:00
|
|
|
position: absolute;
|
|
|
|
pointer-events: none;
|
|
|
|
top: 2px;
|
|
|
|
left: 2px;
|
|
|
|
width: 1px;
|
|
|
|
height: 1px;
|
|
|
|
`);
|
|
|
|
|
2024-01-18 17:23:50 +00:00
|
|
|
export const cssDragWrapper = styled('div', `
|
|
|
|
position: absolute;
|
|
|
|
inset: 0px;
|
|
|
|
left: -16px;
|
|
|
|
top: 0px;
|
|
|
|
height: 100%;
|
|
|
|
width: 16px;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssDrag = styled(icon, `
|
|
|
|
position: absolute;
|
|
|
|
visibility: var(--hover-visible, hidden);
|
|
|
|
top: calc(50% - 16px / 2);
|
|
|
|
width: 16px;
|
|
|
|
height: 16px;
|
2024-01-24 09:58:19 +00:00
|
|
|
--icon-color: ${theme.controlPrimaryBg};
|
2024-01-18 17:23:50 +00:00
|
|
|
&-top {
|
|
|
|
top: 16px;
|
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
|
|
|
|
2023-12-12 09:58:20 +00:00
|
|
|
export const cssPreview = styled('iframe', `
|
|
|
|
height: 100%;
|
2024-01-18 17:23:50 +00:00
|
|
|
width: 100%;
|
2023-12-12 09:58:20 +00:00
|
|
|
border: 0px;
|
|
|
|
`);
|
2024-01-12 17:35:24 +00:00
|
|
|
|
|
|
|
export const cssSwitcher = styled('div', `
|
2024-04-11 06:50:30 +00:00
|
|
|
border-top: 1px solid ${theme.menuBorder};
|
|
|
|
width: 100%;
|
2024-01-12 17:35:24 +00:00
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssSwitcherMessage = styled('div', `
|
|
|
|
display: flex;
|
2024-04-11 06:50:30 +00:00
|
|
|
padding: 8px 16px;
|
2024-01-12 17:35:24 +00:00
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssSwitcherMessageBody = styled('div', `
|
|
|
|
flex-grow: 1;
|
|
|
|
display: flex;
|
|
|
|
justify-content: center;
|
|
|
|
align-items: center;
|
2024-04-11 06:50:30 +00:00
|
|
|
padding: 8px 16px;
|
2024-01-12 17:35:24 +00:00
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssSwitcherMessageDismissButton = styled('div', `
|
|
|
|
align-self: flex-start;
|
|
|
|
flex-shrink: 0;
|
|
|
|
padding: 0px;
|
|
|
|
border-radius: 4px;
|
|
|
|
cursor: pointer;
|
|
|
|
--icon-color: ${theme.controlSecondaryFg};
|
|
|
|
|
|
|
|
&:hover {
|
|
|
|
background-color: ${theme.hover};
|
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssParagraph = styled('div', `
|
|
|
|
margin-bottom: 16px;
|
|
|
|
`);
|
2024-01-18 17:23:50 +00:00
|
|
|
|
|
|
|
export const cssFormEditBody = styled('div', `
|
|
|
|
width: 100%;
|
|
|
|
overflow: auto;
|
2024-04-11 06:50:30 +00:00
|
|
|
padding: 20px;
|
2024-01-18 17:23:50 +00:00
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssRemoveButton = styled('div', `
|
|
|
|
position: absolute;
|
|
|
|
right: 11px;
|
|
|
|
top: 11px;
|
|
|
|
border-radius: 3px;
|
2024-01-24 09:58:19 +00:00
|
|
|
background: ${theme.attachmentsEditorButtonHoverBg};
|
2024-01-18 17:23:50 +00:00
|
|
|
display: none;
|
|
|
|
height: 16px;
|
|
|
|
width: 16px;
|
|
|
|
align-items: center;
|
|
|
|
justify-content: center;
|
|
|
|
line-height: 0px;
|
|
|
|
z-index: 3;
|
|
|
|
& > div {
|
|
|
|
height: 13px;
|
|
|
|
width: 13px;
|
|
|
|
}
|
|
|
|
&:hover {
|
2024-01-24 09:58:19 +00:00
|
|
|
background: ${theme.controlSecondaryHoverBg};
|
2024-01-18 17:23:50 +00:00
|
|
|
cursor: pointer;
|
|
|
|
}
|
|
|
|
.${cssFieldEditor.className}-selected > &,
|
2024-03-20 14:51:59 +00:00
|
|
|
.${cssFieldEditor.className}:hover:not(:has(.hover_border:hover)) > & {
|
2024-01-18 17:23:50 +00:00
|
|
|
display: flex;
|
|
|
|
}
|
|
|
|
&-right {
|
|
|
|
right: -20px;
|
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
2024-03-20 14:51:59 +00:00
|
|
|
export const cssShareMenu = styled('div', `
|
|
|
|
color: ${theme.text};
|
|
|
|
background-color: ${theme.popupBg};
|
|
|
|
width: min(calc(100% - 16px), 400px);
|
|
|
|
border-radius: 3px;
|
|
|
|
padding: 8px;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuHeader = styled('div', `
|
|
|
|
display: flex;
|
|
|
|
justify-content: flex-end;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuBody = styled('div', `
|
|
|
|
box-sizing: content-box;
|
|
|
|
display: flex;
|
|
|
|
flex-direction: column;
|
|
|
|
row-gap: 32px;
|
|
|
|
padding: 0px 16px 24px 16px;
|
|
|
|
min-height: 160px;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuCloseButton = styled('div', `
|
|
|
|
flex-shrink: 0;
|
|
|
|
border-radius: 4px;
|
|
|
|
cursor: pointer;
|
|
|
|
padding: 4px;
|
|
|
|
--icon-color: ${theme.popupCloseButtonFg};
|
|
|
|
|
|
|
|
&:hover {
|
|
|
|
background-color: ${theme.hover};
|
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuSectionHeading = styled('div', `
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
justify-content: space-between;
|
|
|
|
font-weight: 600;
|
|
|
|
margin-bottom: 16px;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuHintText = styled('div', `
|
|
|
|
color: ${theme.lightText};
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuSpinner = styled('div', `
|
|
|
|
display: flex;
|
|
|
|
justify-content: center;
|
|
|
|
align-items: center;
|
|
|
|
min-height: inherit;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuSectionButtons = styled('div', `
|
|
|
|
display: flex;
|
|
|
|
justify-content: flex-end;
|
|
|
|
margin-top: 16px;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuUrlBlock = styled('div', `
|
|
|
|
display: flex;
|
|
|
|
background-color: ${theme.inputReadonlyBg};
|
|
|
|
padding: 8px;
|
|
|
|
border-radius: 3px;
|
|
|
|
width: 100%;
|
|
|
|
margin-top: 16px;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuUrl = styled('input', `
|
|
|
|
background: transparent;
|
|
|
|
flex-grow: 1;
|
|
|
|
overflow: hidden;
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
border: none;
|
|
|
|
outline: none;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuCopyButton = styled(textButton, `
|
|
|
|
margin-left: 4px;
|
|
|
|
font-weight: 500;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuEmbedFormButton = styled(textButton, `
|
|
|
|
font-weight: 500;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuCodeBlock = styled('div', `
|
|
|
|
border-radius: 3px;
|
|
|
|
background-color: ${theme.inputReadonlyBg};
|
|
|
|
padding: 8px;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuCodeBlockButtons = styled('div', `
|
|
|
|
display: flex;
|
|
|
|
justify-content: flex-end;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssShareMenuCode = styled('textarea', `
|
|
|
|
background-color: transparent;
|
|
|
|
border: none;
|
|
|
|
border-radius: 3px;
|
|
|
|
word-break: break-all;
|
|
|
|
width: 100%;
|
|
|
|
outline: none;
|
|
|
|
resize: none;
|
|
|
|
`);
|
|
|
|
|
|
|
|
export const cssFormDisabledOverlay = styled('div', `
|
|
|
|
background-color: ${theme.widgetBg};
|
|
|
|
opacity: 0.8;
|
|
|
|
position: absolute;
|
|
|
|
top: 0;
|
|
|
|
left: 0;
|
|
|
|
right: 0;
|
|
|
|
bottom: 0;
|
|
|
|
z-index: 100;
|
|
|
|
`);
|
|
|
|
|
2024-01-18 17:23:50 +00:00
|
|
|
export function saveControls(editMode: Observable<boolean>, save: (ok: boolean) => void) {
|
|
|
|
return [
|
|
|
|
dom.onKeyDown({
|
|
|
|
Enter$: (ev) => {
|
|
|
|
// if shift ignore
|
|
|
|
if (ev.shiftKey) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
ev.stopPropagation();
|
|
|
|
ev.preventDefault();
|
|
|
|
save(true);
|
|
|
|
editMode.set(false);
|
|
|
|
if (ev.target && 'blur' in ev.target) {
|
|
|
|
(ev.target as any).blur();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
Escape: (ev) => {
|
|
|
|
save(false);
|
|
|
|
editMode.set(false);
|
|
|
|
if (ev.target && 'blur' in ev.target) {
|
|
|
|
(ev.target as any).blur();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
dom.on('blur', (ev) => {
|
|
|
|
if (!editMode.isDisposed() && editMode.get()) {
|
|
|
|
save(true);
|
|
|
|
editMode.set(false);
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
];
|
|
|
|
}
|