mirror of
https://github.com/flynx/pWiki.git
synced 2025-10-28 09:30:07 +00:00
854 lines
16 KiB
CSS
Executable File
854 lines
16 KiB
CSS
Executable File
/**********************************************************************
|
|
*
|
|
*
|
|
*
|
|
**********************************************************************/
|
|
|
|
:root {
|
|
--font-size: 5mm;
|
|
|
|
--outline-padding: 7rem;
|
|
|
|
--item-indent: 2rem;
|
|
--item-padding-ratio: 0.2;
|
|
|
|
--checkbox-size: 1.5rem;
|
|
--checkbox-margin: 0.5em;
|
|
|
|
--button-size: 2em;
|
|
|
|
}
|
|
|
|
|
|
/*********************************************************************/
|
|
|
|
:root {
|
|
font-family: sans-serif;
|
|
font-size: var(--font-size);
|
|
|
|
/*text-size-adjust: none;*/
|
|
text-size-adjust: 180%;
|
|
|
|
background: white;
|
|
color: black;
|
|
}
|
|
|
|
:host,
|
|
.editor {
|
|
--item-padding: calc(1em * var(--item-padding-ratio));
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************/
|
|
|
|
:host,
|
|
.editor {
|
|
display: block;
|
|
position: relative;
|
|
|
|
|
|
/* loading indicator */
|
|
&.loading {
|
|
.outline {
|
|
pointer-events: none;
|
|
}
|
|
.outline>.block {
|
|
opacity: 0.2;
|
|
}
|
|
/* XXX STUB... */
|
|
.outline:before {
|
|
content: "Loading...";
|
|
display: block;
|
|
position: absolute;
|
|
top: 1em;
|
|
}
|
|
.outline:empty:before {
|
|
position: relative;
|
|
top: 0;
|
|
}
|
|
/* override empty indicator */
|
|
.outline:after {
|
|
content: "" !important;
|
|
}
|
|
}
|
|
|
|
|
|
/* editor code */
|
|
&>.code {
|
|
display: none;
|
|
}
|
|
|
|
/* header */
|
|
.header {
|
|
margin: 1em var(--outline-padding);
|
|
padding-bottom: 1.2em;
|
|
|
|
border-bottom: solid 1px rgba(0,0,0,0.15);
|
|
|
|
&:empty {
|
|
display: none;
|
|
}
|
|
.path-item {
|
|
color: gray;
|
|
cursor: pointer;
|
|
/* XXX needs more work... */
|
|
max-width: 10rem;
|
|
text-overflow: ellipsis;
|
|
|
|
&:hover {
|
|
text-decoration: underline;
|
|
}
|
|
&:first-child {
|
|
padding-left: 3em;
|
|
margin-left: -2em;
|
|
}
|
|
}
|
|
}
|
|
|
|
.outline {
|
|
display: block;
|
|
position: relative;
|
|
|
|
padding: 1em var(--outline-padding);
|
|
padding-bottom: 1.2em;
|
|
|
|
/* virtual empty block... */
|
|
&:empty:after {
|
|
content: "Empty";
|
|
display: block;
|
|
font-style: italic;
|
|
color: rgba(0,0,0,0.2);
|
|
}
|
|
&:empty:hover:after {
|
|
}
|
|
|
|
|
|
.block .block {
|
|
margin-left: var(--item-indent);
|
|
}
|
|
.block {
|
|
position: relative;
|
|
outline: none;
|
|
border: none;
|
|
|
|
/* focus... */
|
|
&:focus {
|
|
/*outline: solid 0.2em silver;*/
|
|
outline: none;
|
|
}
|
|
&:focus>.text {
|
|
background: rgba(0,0,0,0.07);
|
|
}
|
|
&.focused:not(:focus)>.text {
|
|
background: rgba(0,0,0,0.01);
|
|
}
|
|
|
|
/* collapsed block... */
|
|
&[collapsed] {
|
|
border-bottom: solid 1px silver;
|
|
&>.children {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
/* select... */
|
|
/* XXX are we selecting subtrees or blocks??? */
|
|
&[selected]>.text {
|
|
background: silver;
|
|
}
|
|
|
|
&>.text {
|
|
--v-margin: 0;
|
|
|
|
display: block;
|
|
width: 100%;
|
|
/* XXX this is a tiny bit off and using .code's height here is off too... */
|
|
min-height: calc(1em + var(--item-padding) * 2);
|
|
padding-top: var(--item-padding);
|
|
padding-bottom: var(--item-padding);
|
|
padding-left: 0;
|
|
padding-right: 0;
|
|
margin: var(--v-margin) 0;
|
|
box-sizing: border-box;
|
|
|
|
font-family: sans-serif;
|
|
font-size: var(--font-size);
|
|
white-space: pre-wrap;
|
|
|
|
outline: none;
|
|
border: none;
|
|
}
|
|
|
|
&>.code {
|
|
position: absolute;
|
|
top: 0;
|
|
/* XXX this is not correct -- it expands the code to cover
|
|
the whole element incl. children... */
|
|
height: 100%;
|
|
/*height: calc(2 * var(--item-padding) + 1em);*/
|
|
overflow: hidden;
|
|
resize: none;
|
|
opacity: 0;
|
|
|
|
/* show/hide node's view/code... */
|
|
&:focus {
|
|
position: relative;
|
|
opacity: 1;
|
|
}
|
|
/* hide .view content but show before/after -- keep bulets and touch zones... */
|
|
&:focus+.view {
|
|
position: absolute;
|
|
top: 0;
|
|
visibility: hidden;
|
|
|
|
&:before,
|
|
&:after {
|
|
visibility: visible;
|
|
margin-top: calc(-1 * var(--v-margin));
|
|
margin-bottom: calc(-1 * var(--v-margin));
|
|
}
|
|
}
|
|
}
|
|
|
|
/* click through the .view text to the .code */
|
|
/* NOTE: .view visibility is handled in .code above... */
|
|
&>.view {
|
|
position: relative;
|
|
pointer-events: none;
|
|
user-select: none;
|
|
|
|
/* clickable things in view */
|
|
& a,
|
|
& pre,
|
|
& button,
|
|
& select,
|
|
& input {
|
|
pointer-events: auto;
|
|
}
|
|
|
|
/* click/tap zones for expand button... */
|
|
&:before,
|
|
&:after {
|
|
--size: 3rem;
|
|
|
|
content: "";
|
|
position: absolute;
|
|
display: flex;
|
|
top: 0;
|
|
right: calc(-1 * var(--size));
|
|
width: var(--size);
|
|
height: 100%;
|
|
|
|
align-items: top;
|
|
justify-content: center;
|
|
|
|
box-sizing: border-box;
|
|
border-left: solid 0.5em transparent;
|
|
border-right: solid 0.5em transparent;
|
|
|
|
/* make the text align to the center of the first line... */
|
|
font-size: 1rem;
|
|
/* XXX the 1.1 coeficient here is a hack... */
|
|
line-height: calc(
|
|
var(--font-size)
|
|
* 1.1
|
|
+ var(--font-size)
|
|
* var(--item-padding-ratio)
|
|
* 2);
|
|
|
|
pointer-events: auto;
|
|
|
|
cursor: pointer;
|
|
background: transparent;
|
|
}
|
|
/* left indicator */
|
|
&:before {
|
|
justify-content: right;
|
|
left: calc(-1 * var(--size));
|
|
}
|
|
}
|
|
|
|
|
|
/* indicators... */
|
|
/* left indicator bullet */
|
|
/* XXX not sure about this yet... */
|
|
&>.view:before {
|
|
content: "●";
|
|
color: rgba(0,0,0,0.07);
|
|
}
|
|
&>.view:empty:before {
|
|
content: "";
|
|
}
|
|
/* right indicator (collapse/expand) */
|
|
&>.view:after {
|
|
color: silver;
|
|
}
|
|
&:has(.block)>.view:after {
|
|
content: "○";
|
|
}
|
|
&[collapsed]>.view:after {
|
|
content: "●";
|
|
}
|
|
|
|
&>.children {
|
|
position: relative;
|
|
}
|
|
}
|
|
|
|
/* block hover... */
|
|
&:empty:hover:after,
|
|
.block:not(.focused):hover>.view {
|
|
background: linear-gradient(
|
|
90deg,
|
|
rgba(0,0,0,0.01) 0%,
|
|
rgba(0,0,0,0.01) 80%,
|
|
rgba(0,0,0,0.03) 100%);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* NOTE: the organization after this point does not feel right/clean,
|
|
* not sure how to do this better...
|
|
*/
|
|
|
|
/* crop... */
|
|
&.crop .outline .block {
|
|
&[cropped] .block,
|
|
&[cropped] .block[cropped] {
|
|
margin-left: var(--item-indent);
|
|
}
|
|
|
|
&:not([cropped]) {
|
|
padding: 0;
|
|
border: none;
|
|
background: none;
|
|
|
|
.text {
|
|
display: none;
|
|
}
|
|
}
|
|
&,
|
|
&[cropped] {
|
|
margin-left: 0;
|
|
}
|
|
/* XXX nesting this in &[cropped] for some reaon breaks things... */
|
|
&[cropped] .text {
|
|
display: block;
|
|
}
|
|
}
|
|
|
|
/* toolbar... */
|
|
.toolbar {
|
|
display: inline-block;
|
|
position: absolute;
|
|
top: 1em;
|
|
right: 1em;
|
|
|
|
button {
|
|
--margin: 0.1em;
|
|
|
|
display: block;
|
|
|
|
width: calc(var(--button-size) + var(--margin) * 2);
|
|
height: var(--button-size);
|
|
margin: var(--margin);
|
|
|
|
font-size: var(--button-size);
|
|
}
|
|
}
|
|
|
|
&.block-offsets .outline .block {
|
|
border-left: solid 1px silver;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/********************************************************** Styles ***/
|
|
|
|
|
|
/*------------------------------------------------------ Headings ---*/
|
|
|
|
:host .outline,
|
|
.editor .outline {
|
|
.heading {
|
|
margin-top: 1rem;
|
|
|
|
&>.text {
|
|
font-weight: bold;
|
|
border-bottom: solid 1px rgba(0,0,0,0.1);
|
|
}
|
|
}
|
|
.heading .heading .heading .heading>.text,
|
|
.heading-4>.text,
|
|
.heading-5>.text,
|
|
.heading-6>.text {
|
|
border-bottom: none;
|
|
}
|
|
|
|
.heading>.text,
|
|
.heading-1>.text {
|
|
--font-size: 2.5em;
|
|
}
|
|
.heading .heading>.text,
|
|
.heading-2>.text {
|
|
--font-size: 1.9em;
|
|
}
|
|
.heading .heading .heading>.text,
|
|
.heading-3>.text {
|
|
--font-size: 1.5em;
|
|
}
|
|
.heading .heading .heading .heading>.text,
|
|
.heading-4>.text {
|
|
--font-size: 1.3em;
|
|
}
|
|
.heading .heading .heading .heading .heading>.text,
|
|
.heading-5>.text {
|
|
--font-size: 1.1em;
|
|
}
|
|
.heading .heading .heading .heading .heading .heading>.text,
|
|
.heading-6>.text {
|
|
--font-size: 1em;
|
|
}
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------- TOC ---*/
|
|
|
|
:host .outline,
|
|
.editor .outline {
|
|
.toc>.view,
|
|
.TOC>.view {
|
|
padding-top: 0px;
|
|
padding-bottom: 0px;
|
|
}
|
|
}
|
|
|
|
|
|
/*--------------------------------------------------------- Quote ---*/
|
|
|
|
:host .outline .quote>.text,
|
|
.editor .outline .quote>.text {
|
|
--indent: 1rem;
|
|
--v-margin: 0.7rem;
|
|
--item-padding-ratio: 0.7;
|
|
|
|
/* XXX for some reason if this is not set here it will not see the new --item-padding-ratio */
|
|
--item-padding: calc(1rem * var(--item-padding-ratio));
|
|
|
|
padding: var(--item-padding) 1.5rem;
|
|
color: rgba(0,0,0,0.8);
|
|
|
|
/* XXX border messes up bullet alignment... */
|
|
/*border-left: solid 0.2em silver;*/
|
|
box-shadow: inset 0.2em 0 0 0 silver;
|
|
background: rgba(0,0,0,0.05);
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------- List ---*/
|
|
|
|
:host .outline,
|
|
.editor .outline {
|
|
.list-item>.view:before,
|
|
.list>.children {
|
|
&>.block>.view:before {
|
|
content: "◼";
|
|
color: gray;
|
|
}
|
|
&>.list>.children {
|
|
&>.block>.view:before {
|
|
content: "●";
|
|
}
|
|
&>.list>.children {
|
|
&>.block>.view:before {
|
|
content: "○";
|
|
}
|
|
&>.list>.children {
|
|
&>.block>.view:before {
|
|
content: "▪";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/* hide bullets on empty nodes unless they are edited... */
|
|
&>.block>.code:not(:focus)+.view:empty:before {
|
|
content: "" !important;
|
|
}
|
|
/* hide bullets on empty nodes... *//*
|
|
&>.block>.view:empty:before {
|
|
content: "";
|
|
}
|
|
*/
|
|
}
|
|
}
|
|
|
|
|
|
/*------------------------------------------------ Numbered lists ---*/
|
|
|
|
:host .outline .numbered-list>.children,
|
|
.editor .outline .numbered-list>.children {
|
|
counter-reset: numbered-list;
|
|
|
|
&>.block>.view:not(:empty):before {
|
|
counter-increment: numbered-list;
|
|
content: counter(numbered-list) ".";
|
|
color: gray;
|
|
}
|
|
&>.numbered-list>.children {
|
|
&>.block>.view:not(:empty):before {
|
|
counter-increment: numbered-list;
|
|
content: counter(numbered-list, lower-alpha) ".";
|
|
}
|
|
&>.numbered-list>.children {
|
|
&>.block>.view:not(:empty):before {
|
|
counter-increment: numbered-list;
|
|
content: counter(numbered-list, lower-roman) ".";
|
|
}
|
|
&>.numbered-list>.children {
|
|
&>.block>.view:not(:empty):before {
|
|
counter-increment: numbered-list;
|
|
content: counters(numbered-list, ".") ".";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*------------------------------------------------------ hr block ---*/
|
|
|
|
:host .outline,
|
|
.editor .outline {
|
|
.list>.children>.block.hr>.view:before {
|
|
content: "";
|
|
}
|
|
.numbered-list>.children>.block.hr>.view:before {
|
|
content: "";
|
|
}
|
|
}
|
|
|
|
|
|
/*--------------------------------------------------------- Notes ---*/
|
|
|
|
:host .outline .NOTE,
|
|
.editor .outline .NOTE {
|
|
--margin: 1rem;
|
|
--padding-h: 2rem;
|
|
--padding-v: 1.2em;
|
|
|
|
margin: var(--margin) 0;
|
|
padding: var(--padding-v) var(--padding-h);
|
|
border: solid 2px silver;
|
|
background: rgba(0,0,0,0.05);
|
|
|
|
/* XXX this prevents it from being accesible via click/tap... */
|
|
&>.view:empty {
|
|
display: none;
|
|
}
|
|
&:focus>.view:empty {
|
|
display: block;
|
|
}
|
|
&>.view:empty ~ .children {
|
|
margin-left: -1rem;
|
|
}
|
|
&>.view:before {
|
|
content: "" !important;
|
|
}
|
|
/* correct the right click zone... */
|
|
/* XXX need to account for nesting... (???) */
|
|
&.block>.view:after,
|
|
&.block .block>.view:after {
|
|
margin-right: calc(-1 * var(--padding-h));
|
|
}
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------- Status ---*/
|
|
|
|
:host .outline .block,
|
|
.editor .outline .block {
|
|
&.DONE>.view {
|
|
text-decoration: line-through;
|
|
opacity: 0.5;
|
|
}
|
|
&.REJECT>.view {
|
|
text-decoration: line-through;
|
|
}
|
|
}
|
|
|
|
|
|
/*--------------------------------------------------- Highlightes ---*/
|
|
|
|
:host .outline,
|
|
.editor .outline {
|
|
--highlight-color: yellow;
|
|
--highlight-focus-color: rgb(253, 218, 13);
|
|
--highlight-hover-color: rgba(253, 218, 13, 0.5);
|
|
--highlight-focus-hover-color: rgba(253, 218, 13, 0.7);
|
|
|
|
.highlight {
|
|
font-weight: bold;
|
|
background: yellow;
|
|
}
|
|
.XXX {
|
|
&>.view {
|
|
background: var(--highlight-color);
|
|
}
|
|
&:hover>.view {
|
|
background: var(--highlight-hover-color) !important;
|
|
}
|
|
&.focused {
|
|
&>.view,
|
|
&>.text {
|
|
/* XXX can we avoid !important here??? */
|
|
background: var(--highlight-focus-color) !important;
|
|
}
|
|
&:hover>.view {
|
|
background: var(--highlight-focus-hover-color) !important;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*------------------------------------------------------ Comments ---*/
|
|
|
|
:host.hide-comments .outline .comment,
|
|
.editor.hide-comments .outline .comment {
|
|
display: none;
|
|
}
|
|
:host .outline .comment>.view,
|
|
.editor .outline .comment>.view {
|
|
color: silver;
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------- Checkboxes ---*/
|
|
|
|
:host .outline .block,
|
|
.editor .outline .block {
|
|
&.todo>.view {
|
|
width: calc(
|
|
100%
|
|
- var(--checkbox-size)
|
|
- var(--checkbox-margin));
|
|
margin-left: calc(
|
|
var(--checkbox-size)
|
|
+ var(--checkbox-margin));
|
|
}
|
|
&.check>.view input[type=checkbox],
|
|
&.todo>.view input[type=checkbox] {
|
|
height: var(--checkbox-size);
|
|
width: var(--checkbox-size);
|
|
|
|
margin-top: calc(var(--checkbox-size) / -2);
|
|
margin-left: var(--checkbox-margin);
|
|
margin-right: var(--checkbox-margin);
|
|
|
|
transform: translateY(calc(2 * var(--item-padding)));
|
|
|
|
/* NOTE: this appears to be needed for the em sizes above to work correctly */
|
|
font-size: 1em;
|
|
}
|
|
&.check.focused>.view input[type=checkbox].selected,
|
|
&.todo.focused>.view input[type=checkbox].selected {
|
|
outline: solid 0.2em silver;
|
|
}
|
|
&.check:focus>.view input[type=checkbox].selected,
|
|
&.todo:focus>.view input[type=checkbox].selected {
|
|
outline: solid 0.2em gray;
|
|
}
|
|
&.todo>.view input[type=checkbox]:first-child {
|
|
margin-left: calc(
|
|
-1 * var(--checkbox-size)
|
|
- var(--checkbox-margin));
|
|
}
|
|
/* correct the left click zone... */
|
|
&.todo>.view:before {
|
|
margin-left: calc(
|
|
-1 * var(--checkbox-size)
|
|
- var(--checkbox-margin));
|
|
}
|
|
/* status... */
|
|
&>.view .completion[completion]:before {
|
|
content: "(" attr(completion) ")";
|
|
color: gray;
|
|
}
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------- Code ---*/
|
|
|
|
:host .outline .block>.view,
|
|
.editor .outline .block>.view {
|
|
/* XXX for some reason if we omit & where not needed, colors will not apply... */
|
|
& pre,
|
|
&>code,
|
|
& :not(pre)>code {
|
|
font-family: monospace;
|
|
background: rgba(0,0,0,0.07);
|
|
border-radius: 0.2em;
|
|
outline: none;
|
|
}
|
|
& :not(pre)>code {
|
|
padding: 0.1em 0.3em;
|
|
}
|
|
& pre>code {
|
|
--padding: 0.6em;
|
|
|
|
display: block;
|
|
min-width: calc(100% - var(--padding) * 2);
|
|
width: fit-content;
|
|
padding: var(--padding) var(--padding);
|
|
padding-bottom: calc(var(--padding) + 0.2em);
|
|
outline: none;
|
|
}
|
|
|
|
/* scrollbar... */
|
|
& pre {
|
|
margin: 0.8em 0em;
|
|
|
|
overflow-x: visible;
|
|
overflow-y: auto;
|
|
|
|
scrollbar-width: thin;
|
|
}
|
|
& pre::-webkit-scrollbar {
|
|
--size: 0.5rem;
|
|
|
|
width: var(--size);
|
|
height: var(--size);
|
|
|
|
/* XXX due to a bug in chrome this does change the scrollbar curosr... */
|
|
cursor: pointer;
|
|
}
|
|
& pre::-webkit-scrollbar-track {
|
|
background: transparent;
|
|
}
|
|
& pre::-webkit-scrollbar-thumb {
|
|
background: silver;
|
|
}
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------- Tables ---*/
|
|
|
|
:host .outline .block>.view>table,
|
|
.editor .outline .block>.view>table {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
|
|
/* XXX for some reason if we omit & where not needed, colors will not apply... */
|
|
& tr:nth-child(odd) {
|
|
background: rgba(0,0,0,0.03);
|
|
}
|
|
& tr:first-child {
|
|
font-weight: bold;
|
|
border-bottom: solid 0.1rem silver;
|
|
background: transparent;
|
|
}
|
|
& td {
|
|
height: calc(1em + var(--item-padding) * 2);
|
|
padding: 0 1em;
|
|
/*text-align: center;*/
|
|
}
|
|
}
|
|
|
|
|
|
/* XXX EXPERIMENTAL...
|
|
* - need to handle nested blocks somehow...
|
|
*/
|
|
.editor .outline .block.table-2 {
|
|
|
|
&>.view {
|
|
font-size: small;
|
|
color: rgba(0,0,0,0.4);
|
|
}
|
|
|
|
&.focused {
|
|
background: rgba(0,0,0,0.05);
|
|
}
|
|
&:focus {
|
|
background: rgba(0,0,0,0.07);
|
|
}
|
|
&>.code:focus {
|
|
position: absolute;
|
|
}
|
|
|
|
&>.children {
|
|
display: table !important;
|
|
width: 100%;
|
|
|
|
&>.block {
|
|
display: table-row;
|
|
|
|
&:first-child>.view td {
|
|
font-weight: bold;
|
|
border-bottom: solid 0.1rem silver;
|
|
}
|
|
|
|
&:nth-child(even) {
|
|
background: rgba(0,0,0,0.03);
|
|
}
|
|
&:not(:first-child) {
|
|
&>.view td {
|
|
font-weight: normal !important;
|
|
}
|
|
}
|
|
|
|
&.focused {
|
|
background: rgba(0,0,0,0.03);
|
|
}
|
|
&:focus {
|
|
background: rgba(0,0,0,0.07);
|
|
}
|
|
&>.code:focus {
|
|
column-span: all;
|
|
}
|
|
}
|
|
}
|
|
|
|
.block>.children,
|
|
.view,
|
|
table,
|
|
tbody,
|
|
tr {
|
|
display: contents !important;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/********************************************************* Testing ***/
|
|
|
|
:host.show-click-zones .outline .block,
|
|
.editor.show-click-zones .outline .block {
|
|
&>.view {
|
|
&:before,
|
|
&:before,
|
|
&:after {
|
|
background: rgba(0,0,0,0.03);
|
|
border: solid 1px silver;
|
|
}
|
|
}
|
|
&:hover>.view {
|
|
&:before,
|
|
&:after {
|
|
background: rgba(0,0,0,0.1);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
* vim:set ts=4 sw=4 : */
|