* Fix unrelated bug, settings button in the home sidebar
doesn't go to the home settings after my previous fixes to routes
* Turn on "Replay Onboarding" button in home settings
* Add icons
* Add Tooltip component
* Rough-in of sidebar styling and add initial File Tree
* Polish basic styling
* Show nested files and directories
* Add tests
* use camelCase for entrypointMetadata
* Add ability to switch files via links
* Revert "Improve Prop Typings for Modals. Remove instances of `any`. (… (#813)
Revert "Improve Prop Typings for Modals. Remove instances of `any`. (#792)"
This reverts commit 629f326f4c
.
* ffmpeg instructions (#814)
* Formatting
* Remove folder names from display in app header
* Highlight current file, open folders it's within
* Navigate on double click, delete on Cmd + Esc
+ highlight focused folders
* Migrate to an XState machine, add create new file
* Add ability to create folders (with naive names)
+ remove command bar stuff for now
* Use route loader data to instantiate the kcl code
* Clean up some unused things
* Add ability to rename files
* Add ability to rename folders
* Add keyboard shortcuts for creating files/folders
* Tooltip style tweaks
* Polish + re-execute when switching files with a connection
* Reset code before navigating via file tree
* Don't invoke `readProject` if you're in a browser
* Show files and folders for projects on home page
* Don't highlight folders further down the file tree
* @jgomez720 and @jessfraz feedback:
+ indentation markers
+ proper file icon
+ bump down font size
+ touch up colors
* Tune down spacing, allow scroll overflow
* Fix formatting
* Update src/lib/tauriFS.ts
* Add a confirmation dialog when deleting
Signed-off-by: Frank Noirot <frank@kittycad.io>
---------
Signed-off-by: Frank Noirot <frank@kittycad.io>
Co-authored-by: Kurt Hutten <k.hutten@protonmail.ch>
230 lines
5.3 KiB
CSS
230 lines
5.3 KiB
CSS
/* Adapted from https://github.com/argyleink/gui-challenges/blob/main/tooltips/tool-tip.css */
|
|
|
|
.tooltip {
|
|
/* internal CSS vars */
|
|
--_delay: 200ms;
|
|
--_p-inline: 1ch;
|
|
--_p-block: 4px;
|
|
--_triangle-size: 7px;
|
|
/* --_bg: hsl(0 0% 20%); */
|
|
--_bg: var(--chalkboard-10);
|
|
--_shadow-alpha: 20%;
|
|
|
|
/* Used to power spacing and layout for RTL languages */
|
|
--isRTL: -1;
|
|
|
|
/* Using conic gradients to get a clear tip triangle */
|
|
--_bottom-tip: conic-gradient(
|
|
from -30deg at bottom,
|
|
#0000,
|
|
#000 1deg 60deg,
|
|
#0000 61deg
|
|
)
|
|
bottom / 100% 50% no-repeat;
|
|
--_top-tip: conic-gradient(
|
|
from 150deg at top,
|
|
#0000,
|
|
#000 1deg 60deg,
|
|
#0000 61deg
|
|
)
|
|
top / 100% 50% no-repeat;
|
|
--_right-tip: conic-gradient(
|
|
from -120deg at right,
|
|
#0000,
|
|
#000 1deg 60deg,
|
|
#0000 61deg
|
|
)
|
|
right / 50% 100% no-repeat;
|
|
--_left-tip: conic-gradient(
|
|
from 60deg at left,
|
|
#0000,
|
|
#000 1deg 60deg,
|
|
#0000 61deg
|
|
)
|
|
left / 50% 100% no-repeat;
|
|
|
|
pointer-events: none;
|
|
user-select: none;
|
|
|
|
/* The parts that will be transitioned */
|
|
opacity: 0;
|
|
transform: translate(var(--_x, 0), var(--_y, 0));
|
|
transition: transform 0.15s ease-out, opacity 0.11s ease-out;
|
|
|
|
position: absolute;
|
|
z-index: 1;
|
|
inline-size: max-content;
|
|
max-inline-size: 25ch;
|
|
text-align: start;
|
|
font-family: var(--mono-font-family);
|
|
text-transform: none;
|
|
font-size: 0.9rem;
|
|
font-weight: normal;
|
|
line-height: initial;
|
|
letter-spacing: 0;
|
|
padding: var(--_p-block) var(--_p-inline);
|
|
margin: 0;
|
|
border-radius: 3px;
|
|
background: var(--_bg);
|
|
@apply text-chalkboard-110;
|
|
will-change: filter;
|
|
filter: drop-shadow(0 1px 3px hsl(0 0% 0% / var(--_shadow-alpha)))
|
|
drop-shadow(0 6px 12px hsl(0 0% 0% / var(--_shadow-alpha)));
|
|
}
|
|
|
|
:global(.dark) .tooltip {
|
|
--_bg: var(--chalkboard-110);
|
|
@apply text-chalkboard-10;
|
|
}
|
|
|
|
/* TODO we don't support a light theme yet */
|
|
/* @media (prefers-color-scheme: light) {
|
|
.tooltip {
|
|
--_bg: white;
|
|
--_shadow-alpha: 15%;
|
|
}
|
|
} */
|
|
|
|
.tooltip:dir(rtl) {
|
|
--isRTL: 1;
|
|
}
|
|
|
|
/* :has and :is are pretty fresh CSS pseudo-selectors, may not see full support */
|
|
:has(> .tooltip) {
|
|
position: relative;
|
|
}
|
|
|
|
:is(:hover, :focus-visible, :active) > .tooltip {
|
|
opacity: 1;
|
|
transition-delay: var(--_delay);
|
|
}
|
|
|
|
:is(:focus, :focus-visible, :focus-within) > .tooltip {
|
|
--_delay: 0 !important;
|
|
}
|
|
|
|
/* prepend some prose for screen readers only */
|
|
.tooltip::before {
|
|
content: '; Has tooltip: ';
|
|
clip: rect(1px, 1px, 1px, 1px);
|
|
clip-path: inset(50%);
|
|
height: 1px;
|
|
width: 1px;
|
|
margin: -1px;
|
|
overflow: hidden;
|
|
padding: 0;
|
|
position: absolute;
|
|
}
|
|
|
|
/* tooltip shape is a pseudo element so we can cast a shadow */
|
|
.tooltip::after {
|
|
content: '';
|
|
background: var(--_bg);
|
|
position: absolute;
|
|
z-index: -1;
|
|
inset: 0;
|
|
mask: var(--_tip);
|
|
}
|
|
|
|
.tooltip.top,
|
|
.tooltip.blockStart,
|
|
.tooltip.bottom,
|
|
.tooltip.blockEnd {
|
|
text-align: center;
|
|
}
|
|
|
|
/* TOP || BLOCK-START */
|
|
.tooltip.top,
|
|
.tooltip.blockStart {
|
|
inset-inline-start: 50%;
|
|
inset-block-end: calc(100% + var(--_p-block) + var(--_triangle-size));
|
|
--_x: calc(50% * var(--isRTL));
|
|
}
|
|
|
|
.tooltip.top::after,
|
|
.tooltip.tooltip.blockStart::after {
|
|
--_tip: var(--_bottom-tip);
|
|
inset-block-end: calc(var(--_triangle-size) * -1);
|
|
border-block-end: var(--_triangle-size) solid transparent;
|
|
}
|
|
|
|
/* RIGHT || INLINE-END */
|
|
.tooltip.right,
|
|
.tooltip.inlineEnd {
|
|
inset-inline-start: calc(100% + var(--_p-inline) + var(--_triangle-size));
|
|
inset-block-end: 50%;
|
|
--_y: 50%;
|
|
}
|
|
|
|
.tooltip.right::after,
|
|
.tooltip.tooltip.inlineEnd::after {
|
|
--_tip: var(--_left-tip);
|
|
inset-inline-start: calc(var(--_triangle-size) * -1);
|
|
border-inline-start: var(--_triangle-size) solid transparent;
|
|
}
|
|
|
|
.tooltip.right:dir(rtl)::after,
|
|
.tooltip.inlineEnd:dir(rtl)::after {
|
|
--_tip: var(--_right-tip);
|
|
}
|
|
|
|
/* BOTTOM || BLOCK-END */
|
|
.tooltip.bottom,
|
|
.tooltip.blockEnd {
|
|
inset-inline-start: 50%;
|
|
inset-block-start: calc(100% + var(--_p-block) + var(--_triangle-size));
|
|
--_x: calc(50% * var(--isRTL));
|
|
}
|
|
|
|
.tooltip.bottom::after,
|
|
.tooltip.tooltip.blockEnd::after {
|
|
--_tip: var(--_top-tip);
|
|
inset-block-start: calc(var(--_triangle-size) * -1);
|
|
border-block-start: var(--_triangle-size) solid transparent;
|
|
}
|
|
|
|
/* LEFT || INLINE-START */
|
|
.tooltip.left,
|
|
.tooltip.inlineStart {
|
|
inset-inline-end: calc(100% + var(--_p-inline) + var(--_triangle-size));
|
|
inset-block-end: 50%;
|
|
--_y: 50%;
|
|
}
|
|
|
|
.tooltip.left::after,
|
|
.tooltip.tooltip.inlineStart::after {
|
|
--_tip: var(--_right-tip);
|
|
inset-inline-end: calc(var(--_triangle-size) * -1);
|
|
border-inline-end: var(--_triangle-size) solid transparent;
|
|
}
|
|
|
|
.tooltip.left:dir(rtl)::after,
|
|
.tooltip.inlineStart:dir(rtl)::after {
|
|
--_tip: var(--_left-tip);
|
|
}
|
|
|
|
@media (prefers-reduced-motion: no-preference) {
|
|
/* TOP || BLOCK-START */
|
|
:has(> :is(.tooltip.top, .tooltip.blockStart)):not(:hover, :active) .tooltip {
|
|
--_y: 3px;
|
|
}
|
|
|
|
/* RIGHT || INLINE-END */
|
|
:has(> :is(.tooltip.right, .tooltip.inlineEnd)):not(:hover, :active)
|
|
.tooltip {
|
|
--_x: calc(var(--isRTL) * -3px * -1);
|
|
}
|
|
|
|
/* BOTTOM || BLOCK-END */
|
|
:has(> :is(.tooltip.bottom, .tooltip.blockEnd)):not(:hover, :active)
|
|
.tooltip {
|
|
--_y: -3px;
|
|
}
|
|
|
|
/* BOTTOM || BLOCK-END */
|
|
:has(> :is(.tooltip.left, .tooltip.inlineStart)):not(:hover, :active)
|
|
.tooltip {
|
|
--_x: calc(var(--isRTL) * 3px * -1);
|
|
}
|
|
}
|