Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
03eae6069e | ||
|
|
0991512434 | ||
|
|
68081128b3 | ||
|
|
c8d0ddd437 | ||
|
|
e9cfd3c6d3 | ||
|
|
a25efe8dba | ||
|
|
6f61f73a91 | ||
|
|
bfa381ef26 |
@@ -15,18 +15,22 @@ monstera
|
||||
|
||||
# Search tags and terms used in icon and category metadata
|
||||
checkmark
|
||||
activitypub
|
||||
ageusia
|
||||
artboard
|
||||
barbeque
|
||||
choy
|
||||
cicd
|
||||
ecommerce
|
||||
enby
|
||||
fediverse
|
||||
flexbox
|
||||
futbol
|
||||
gddr
|
||||
glassmorphism
|
||||
gltf
|
||||
halloumi
|
||||
helpdesk
|
||||
interpoint
|
||||
interpunct
|
||||
middot
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<script setup>
|
||||
import Icon from '@lucide/vue/src/Icon';
|
||||
import { search } from '../../../data/iconNodes';
|
||||
import Kbd from './Kbd.vue';
|
||||
|
||||
defineProps({
|
||||
shortcut: {
|
||||
@@ -17,10 +18,10 @@ defineProps({
|
||||
class="search-icon"
|
||||
/>
|
||||
<slot />
|
||||
<kbd
|
||||
<Kbd
|
||||
v-if="shortcut"
|
||||
class="shortcut"
|
||||
>{{ shortcut }}</kbd
|
||||
>{{ shortcut }}</Kbd
|
||||
>
|
||||
</button>
|
||||
</template>
|
||||
@@ -59,7 +60,9 @@ defineProps({
|
||||
|
||||
.search-icon {
|
||||
flex-shrink: 0;
|
||||
transition: color 0.25s, transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||
transition:
|
||||
color 0.25s,
|
||||
transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||
transition-duration: 0.25s, 0.3s;
|
||||
}
|
||||
|
||||
@@ -70,15 +73,6 @@ defineProps({
|
||||
|
||||
.shortcut {
|
||||
margin-left: auto;
|
||||
padding: 2px 6px;
|
||||
font-size: 12px;
|
||||
font-family: inherit;
|
||||
font-weight: 500;
|
||||
line-height: 1.5;
|
||||
color: var(--vp-c-text-3);
|
||||
background: var(--vp-c-default-soft);
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
@media (hover: none) {
|
||||
|
||||
@@ -15,6 +15,7 @@ import { ref, onMounted, nextTick, watch } from 'vue';
|
||||
import Icon from '@lucide/vue/src/Icon';
|
||||
import { x } from '../../../data/iconNodes';
|
||||
import Button from './Button.vue';
|
||||
import Kbd from './Kbd.vue';
|
||||
|
||||
const props = withDefaults(defineProps<InputProps>(), {
|
||||
type: 'text',
|
||||
@@ -29,7 +30,7 @@ const emit = defineEmits(['change', 'input', 'update:modelValue']);
|
||||
const updateShortcutSpacing = () => {
|
||||
nextTick(() => {
|
||||
if (shortcutEl.value && wrapperEl.value) {
|
||||
const shortcutWidth = shortcutEl.value.offsetWidth;
|
||||
const shortcutWidth = shortcutEl.value.$el.offsetWidth;
|
||||
wrapperEl.value.style.setProperty('--shortcut-width', `${shortcutWidth}px`);
|
||||
}
|
||||
});
|
||||
@@ -83,11 +84,11 @@ defineExpose({
|
||||
:size="20"
|
||||
/>
|
||||
</Button>
|
||||
<kbd
|
||||
<Kbd
|
||||
v-if="shortcut"
|
||||
class="shortcut"
|
||||
ref="shortcutEl"
|
||||
>{{ shortcut }}</kbd
|
||||
>{{ shortcut }}</Kbd
|
||||
>
|
||||
</div>
|
||||
</template>
|
||||
@@ -146,33 +147,24 @@ defineExpose({
|
||||
right: 12px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
padding: 2px 6px;
|
||||
font-size: 12px;
|
||||
font-family: inherit;
|
||||
font-weight: 500;
|
||||
line-height: 1.5;
|
||||
color: var(--vp-c-text-3);
|
||||
background: var(--vp-c-default-soft);
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
border-radius: 4px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.input[type="search"]::-webkit-search-cancel-button {
|
||||
.input[type='search']::-webkit-search-cancel-button {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.input[type="search"]::-ms-clear {
|
||||
.input[type='search']::-ms-clear {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.input[type="search"]::-o-clear {
|
||||
.input[type='search']::-o-clear {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.input[type="search"]::-moz-clear {
|
||||
.input[type='search']::-moz-clear {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@@ -195,7 +187,9 @@ defineExpose({
|
||||
z-index: 1;
|
||||
color: var(--vp-c-text-2);
|
||||
pointer-events: none;
|
||||
transition: color 0.25s, transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||
transition:
|
||||
color 0.25s,
|
||||
transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||
transition-duration: 0.25s, 0.3s;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,18 +1,28 @@
|
||||
<script setup lang="ts">
|
||||
defineProps<{
|
||||
label: string
|
||||
id: string
|
||||
}>()
|
||||
label: string;
|
||||
id: string;
|
||||
class?: string;
|
||||
}>();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="input-field">
|
||||
<div class="input-label" v-if="label">
|
||||
<label :for="id" class="customize-label">
|
||||
<div
|
||||
class="input-field"
|
||||
:class="class"
|
||||
>
|
||||
<div
|
||||
class="input-label"
|
||||
v-if="label"
|
||||
>
|
||||
<label
|
||||
:for="id"
|
||||
class="customize-label"
|
||||
>
|
||||
{{ label }}
|
||||
</label>
|
||||
<div class="display-value" >
|
||||
<slot name="display"/>
|
||||
<div class="display-value">
|
||||
<slot name="display" />
|
||||
</div>
|
||||
</div>
|
||||
<slot />
|
||||
@@ -25,7 +35,7 @@ defineProps<{
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
color: var(--vt-c-text-1);
|
||||
transition: color .5s;
|
||||
transition: color 0.5s;
|
||||
display: block;
|
||||
}
|
||||
|
||||
@@ -43,6 +53,6 @@ defineProps<{
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 8px;
|
||||
gap: 12px;
|
||||
gap: 6px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<template>
|
||||
<kbd class="kbd"><slot /></kbd>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.kbd {
|
||||
display: inline-block;
|
||||
min-width: 24px;
|
||||
padding: 2px 6px;
|
||||
font-family: inherit;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
line-height: 1.5;
|
||||
text-align: center;
|
||||
color: var(--vp-c-text-2);
|
||||
background: var(--vp-c-default-soft);
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
border-radius: 4px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,59 @@
|
||||
<script setup lang="ts">
|
||||
import { Toaster } from 'vue-sonner';
|
||||
import 'vue-sonner/style.css';
|
||||
import { useData } from 'vitepress';
|
||||
import Icon from '@lucide/vue/src/Icon.ts';
|
||||
import { check } from '../../../data/iconNodes';
|
||||
|
||||
const { isDark } = useData();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<ClientOnly>
|
||||
<Toaster
|
||||
position="bottom-center"
|
||||
:theme="isDark ? 'dark' : 'light'"
|
||||
>
|
||||
<template #success-icon>
|
||||
<Icon
|
||||
:iconNode="check"
|
||||
name="check"
|
||||
:size="24"
|
||||
/>
|
||||
</template>
|
||||
</Toaster>
|
||||
</ClientOnly>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
/* Same surface as base/Card.vue. The extra :root outranks sonner's per-theme rules */
|
||||
:root [data-sonner-toaster][data-sonner-theme] {
|
||||
--normal-bg: var(--vp-c-bg-soft);
|
||||
--normal-border: var(--vp-c-divider);
|
||||
--normal-text: var(--vp-c-text-1);
|
||||
--border-radius: 12px;
|
||||
}
|
||||
|
||||
/* Keep the icon and the text on one centred line; the site's line-height pushes the text down */
|
||||
[data-sonner-toast] {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
[data-sonner-toast] [data-icon] {
|
||||
align-self: center;
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Sonner's icon box is 16px, so match the 24px check to stop it overflowing into the text */
|
||||
[data-sonner-toast][data-styled='true'][data-type='success'] [data-icon] {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
color: var(--vp-c-success-1);
|
||||
}
|
||||
|
||||
[data-sonner-toast] [data-content],
|
||||
[data-sonner-toast] [data-title] {
|
||||
line-height: 20px;
|
||||
}
|
||||
</style>
|
||||
@@ -3,6 +3,7 @@ import { computed } from 'vue';
|
||||
import createLucideIcon from '@lucide/vue/src/createLucideIcon';
|
||||
import { useMediaQuery } from '@vueuse/core';
|
||||
import { useRouter } from 'vitepress';
|
||||
import { toast } from 'vue-sonner';
|
||||
import getSVGIcon from '../../utils/getSVGIcon';
|
||||
import useConfetti from '../../composables/useConfetti';
|
||||
import Tooltip from '../base/Tooltip.vue';
|
||||
@@ -38,17 +39,37 @@ const href = computed(() =>
|
||||
props.externalLibrary ? `/icons/${props.externalLibrary}/${props.name}` : `/icons/${props.name}`,
|
||||
);
|
||||
|
||||
// The toast says what was copied, since the name and the SVG are copied the same way
|
||||
async function copyToClipboard(text: string, confettiMessage: string, toastMessage: string) {
|
||||
await navigator.clipboard.writeText(text);
|
||||
|
||||
confettiText.value = confettiMessage;
|
||||
confetti();
|
||||
toast.success(toastMessage);
|
||||
}
|
||||
|
||||
function copyName() {
|
||||
return copyToClipboard(props.name, `Copied name!`, `Copied the name of ${props.name}`);
|
||||
}
|
||||
|
||||
function copySVG(iconButton: HTMLElement) {
|
||||
const svgString = getSVGIcon(iconButton.querySelector('svg'), {
|
||||
class: `lucide lucide-${props.name}`,
|
||||
});
|
||||
|
||||
return copyToClipboard(svgString, `Copied SVG!`, `Copied the SVG of ${props.name}`);
|
||||
}
|
||||
|
||||
async function navigateToIcon(event) {
|
||||
if (event.shiftKey) {
|
||||
event.preventDefault();
|
||||
const svgString = getSVGIcon(event.target.firstChild, {
|
||||
class: `lucide lucide-${props.name}`,
|
||||
});
|
||||
await copySVG(event.currentTarget);
|
||||
return;
|
||||
}
|
||||
|
||||
await navigator.clipboard.writeText(svgString);
|
||||
|
||||
confettiText.value = copiedText;
|
||||
confetti();
|
||||
if (event.ctrlKey || event.metaKey) {
|
||||
event.preventDefault();
|
||||
await copyName();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -76,6 +97,34 @@ async function navigateToIcon(event) {
|
||||
}
|
||||
}
|
||||
|
||||
// On a selected (focused) icon: Enter opens it, Ctrl/Cmd + C copies its name, Shift + C its SVG.
|
||||
// (Ctrl/Cmd + Shift + C is the browser's inspect shortcut, so it can't be used for the SVG.)
|
||||
async function handleKeydown(event: KeyboardEvent) {
|
||||
if (
|
||||
event.key === 'Enter' &&
|
||||
!(event.shiftKey || event.ctrlKey || event.metaKey || event.altKey)
|
||||
) {
|
||||
await navigateToIcon(event);
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.key.toLowerCase() !== 'c' || event.altKey) return;
|
||||
|
||||
if (event.shiftKey && !(event.ctrlKey || event.metaKey)) {
|
||||
event.preventDefault();
|
||||
await copySVG(event.currentTarget as HTMLElement);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(event.ctrlKey || event.metaKey) || event.shiftKey) return;
|
||||
|
||||
// Leave a normal copy alone when some text on the page is selected
|
||||
if (window.getSelection()?.toString()) return;
|
||||
|
||||
event.preventDefault();
|
||||
await copyName();
|
||||
}
|
||||
|
||||
const DiamondIcon = createLucideIcon('Diamond', diamond);
|
||||
</script>
|
||||
|
||||
@@ -83,7 +132,9 @@ const DiamondIcon = createLucideIcon('Diamond', diamond);
|
||||
<Tooltip :title="name">
|
||||
<a
|
||||
class="icon-button confetti-button vp-raw"
|
||||
tabindex="0"
|
||||
@click="navigateToIcon"
|
||||
@keydown="handleKeydown"
|
||||
:class="{ active, animate }"
|
||||
:aria-label="name"
|
||||
:data-confetti-text="confettiText"
|
||||
@@ -151,6 +202,12 @@ const DiamondIcon = createLucideIcon('Diamond', diamond);
|
||||
|
||||
.confetti-button:before {
|
||||
line-height: 80px;
|
||||
/* Center the "Copied ..." text over the icon (it started at the icon's left edge and ran off to the right). */
|
||||
width: 160px;
|
||||
max-width: none;
|
||||
left: calc(50% - 80px);
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.icon-button:active {
|
||||
@@ -186,10 +243,16 @@ const DiamondIcon = createLucideIcon('Diamond', diamond);
|
||||
background-color: var(--vp-button-alt-active-bg);
|
||||
}
|
||||
|
||||
.icon-button.active {
|
||||
.icon-button.active,
|
||||
.icon-button.animate,
|
||||
.icon-button:focus-visible {
|
||||
border-color: var(--vp-c-brand);
|
||||
}
|
||||
|
||||
.icon-button:focus-visible {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.lucide-icon {
|
||||
margin: auto;
|
||||
pointer-events: none;
|
||||
|
||||
@@ -208,6 +208,43 @@ function handleCloseDrawer() {
|
||||
|
||||
window.history.pushState({}, '', url);
|
||||
}
|
||||
|
||||
const ARROW_STEPS = {
|
||||
ArrowLeft: () => -1,
|
||||
ArrowRight: () => 1,
|
||||
ArrowUp: () => -columnSize.value,
|
||||
ArrowDown: () => columnSize.value,
|
||||
};
|
||||
|
||||
// Arrow keys move through the search results: from the search field down into the grid, then
|
||||
// between the icons. The grid shows `columnSize` icons per row, so up and down skip a whole row.
|
||||
function handleArrowKeys(event: KeyboardEvent) {
|
||||
const step = ARROW_STEPS[event.key]?.();
|
||||
if (step === undefined || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)
|
||||
return;
|
||||
|
||||
const iconButtons = Array.from(
|
||||
overviewEl.value?.querySelectorAll<HTMLElement>('.icons .icon-button') ?? [],
|
||||
);
|
||||
const target = event.target as HTMLElement;
|
||||
const fromSearch = target.tagName === 'INPUT' && target.closest('.input-wrapper') !== null;
|
||||
|
||||
let next: HTMLElement | undefined;
|
||||
if (fromSearch) {
|
||||
if (event.key !== 'ArrowDown') return;
|
||||
next = iconButtons[0];
|
||||
} else {
|
||||
const index = iconButtons.indexOf(target);
|
||||
if (index === -1) return;
|
||||
next = iconButtons[index + step];
|
||||
}
|
||||
|
||||
if (next) {
|
||||
event.preventDefault();
|
||||
next.focus();
|
||||
next.scrollIntoView({ block: 'nearest' });
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -215,6 +252,7 @@ function handleCloseDrawer() {
|
||||
ref="overviewEl"
|
||||
class="overview-container"
|
||||
:class="{ 'icon-drawer-open': activeIconName }"
|
||||
@keydown="handleArrowKeys"
|
||||
>
|
||||
<StickyBar>
|
||||
<InputSearch
|
||||
|
||||
@@ -0,0 +1,297 @@
|
||||
<script setup lang="ts">
|
||||
import { nextTick, onBeforeUnmount, onMounted, ref } from 'vue';
|
||||
import Icon from '@lucide/vue/src/Icon';
|
||||
import Kbd from '../base/Kbd.vue';
|
||||
import { x } from '~/.vitepress/data/iconNodes';
|
||||
|
||||
const dialog = ref<HTMLDialogElement | null>(null);
|
||||
const isClosing = ref(false);
|
||||
const modifierKey = ref('Ctrl');
|
||||
|
||||
const shortcuts = [
|
||||
{ keys: ['mod', 'K'], alternative: ['/'], description: 'Search' },
|
||||
{ keys: ['Shift', 'Click'], description: 'Copy the SVG of an icon' },
|
||||
{ keys: ['mod', 'Click'], description: 'Copy the name of an icon' },
|
||||
{ keys: ['Arrow keys'], description: 'Move through the search results' },
|
||||
{ keys: ['Enter'], description: 'Open the selected icon' },
|
||||
{ keys: ['mod', 'C'], description: 'Copy the name of the selected icon' },
|
||||
{ keys: ['Shift', 'C'], description: 'Copy the SVG of the selected icon' },
|
||||
{ keys: ['Shift', '?'], description: 'Show keyboard shortcuts' },
|
||||
];
|
||||
|
||||
function keyLabel(key: string) {
|
||||
return key === 'mod' ? modifierKey.value : key;
|
||||
}
|
||||
|
||||
function open() {
|
||||
dialog.value?.showModal();
|
||||
// Focus the dialog itself rather than its close button, so the button is not shown as selected
|
||||
dialog.value?.focus();
|
||||
}
|
||||
|
||||
// The dialog leaves the top layer as soon as it closes, so play the exit transition first
|
||||
async function close() {
|
||||
const element = dialog.value;
|
||||
|
||||
if (!element?.open || isClosing.value) return;
|
||||
|
||||
isClosing.value = true;
|
||||
await nextTick();
|
||||
await Promise.allSettled(element.getAnimations().map((animation) => animation.finished));
|
||||
element.close();
|
||||
isClosing.value = false;
|
||||
}
|
||||
|
||||
function handleDialogClick(event: MouseEvent) {
|
||||
// A click on the backdrop lands on the dialog element itself
|
||||
if (event.target === dialog.value) {
|
||||
close();
|
||||
}
|
||||
}
|
||||
|
||||
function isTyping(event: KeyboardEvent) {
|
||||
const target = event.target as HTMLElement | null;
|
||||
|
||||
return (
|
||||
target?.isContentEditable ||
|
||||
target?.tagName === 'INPUT' ||
|
||||
target?.tagName === 'TEXTAREA' ||
|
||||
target?.tagName === 'SELECT'
|
||||
);
|
||||
}
|
||||
|
||||
// The ? key opens the dialog, except while typing in a field
|
||||
function handleKeydown(event: KeyboardEvent) {
|
||||
if (event.key === '?' && !event.ctrlKey && !event.metaKey && !event.altKey && !isTyping(event)) {
|
||||
event.preventDefault();
|
||||
open();
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
modifierKey.value = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform) ? '⌘' : 'Ctrl';
|
||||
window.addEventListener('keydown', handleKeydown);
|
||||
});
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
window.removeEventListener('keydown', handleKeydown);
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<button
|
||||
type="button"
|
||||
class="keyboard-shortcuts-hint"
|
||||
aria-haspopup="dialog"
|
||||
@click="open"
|
||||
>
|
||||
<span class="hint-label">Keyboard shortcuts</span>
|
||||
<span class="hint-keys">
|
||||
<Kbd>Shift</Kbd>
|
||||
<span>+</span>
|
||||
<Kbd>?</Kbd>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<dialog
|
||||
ref="dialog"
|
||||
class="shortcuts-dialog"
|
||||
:class="{ closing: isClosing }"
|
||||
tabindex="-1"
|
||||
aria-labelledby="shortcuts-title"
|
||||
@click="handleDialogClick"
|
||||
@cancel.prevent="close"
|
||||
>
|
||||
<div class="shortcuts-header">
|
||||
<h2 id="shortcuts-title">Keyboard shortcuts</h2>
|
||||
<button
|
||||
type="button"
|
||||
class="shortcuts-close"
|
||||
aria-label="Close"
|
||||
@click="close"
|
||||
>
|
||||
<Icon
|
||||
:iconNode="x"
|
||||
name="x"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<dl class="shortcuts-list">
|
||||
<div
|
||||
v-for="shortcut in shortcuts"
|
||||
:key="shortcut.description"
|
||||
class="shortcut-row"
|
||||
>
|
||||
<dt class="shortcut-keys">
|
||||
<template
|
||||
v-for="(key, index) in shortcut.keys"
|
||||
:key="key"
|
||||
>
|
||||
<span
|
||||
v-if="index > 0"
|
||||
class="shortcut-plus"
|
||||
>+</span
|
||||
>
|
||||
<Kbd>{{ keyLabel(key) }}</Kbd>
|
||||
</template>
|
||||
<template v-if="shortcut.alternative">
|
||||
<span class="shortcut-or">or</span>
|
||||
<Kbd
|
||||
v-for="key in shortcut.alternative"
|
||||
:key="key"
|
||||
>{{ key }}</Kbd
|
||||
>
|
||||
</template>
|
||||
</dt>
|
||||
<dd class="shortcut-description">{{ shortcut.description }}</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</dialog>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.keyboard-shortcuts-hint {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
margin-top: 12px;
|
||||
padding: 24px 0px;
|
||||
border-top: 1px solid var(--vp-c-divider);
|
||||
font-size: 12px;
|
||||
color: var(--vp-c-text-1);
|
||||
position: sticky;
|
||||
bottom: -96px;
|
||||
background-color: var(--vp-sidebar-bg-color);
|
||||
width: 100%;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.hint-keys {
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.shortcuts-dialog {
|
||||
width: min(480px, calc(100vw - 32px));
|
||||
padding: 20px 24px 24px;
|
||||
color: var(--vp-c-text-1);
|
||||
background: var(--vp-c-bg);
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
border-radius: 12px;
|
||||
box-shadow: var(--vp-shadow-4);
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.shortcuts-dialog::backdrop {
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
.shortcuts-dialog[open] {
|
||||
transition:
|
||||
opacity 150ms ease-out,
|
||||
transform 200ms cubic-bezier(0.34, 1.4, 0.64, 1);
|
||||
}
|
||||
|
||||
.shortcuts-dialog[open]::backdrop {
|
||||
transition: background-color 150ms ease-out;
|
||||
}
|
||||
|
||||
@starting-style {
|
||||
.shortcuts-dialog[open] {
|
||||
opacity: 0;
|
||||
transform: translateY(-6px) scale(0.98);
|
||||
}
|
||||
|
||||
.shortcuts-dialog[open]::backdrop {
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.shortcuts-dialog.closing {
|
||||
opacity: 0;
|
||||
transform: translateY(-6px) scale(0.98);
|
||||
transition:
|
||||
opacity 150ms ease-in,
|
||||
transform 150ms ease-in;
|
||||
}
|
||||
|
||||
.shortcuts-dialog.closing::backdrop {
|
||||
background-color: transparent;
|
||||
transition: background-color 150ms ease-in;
|
||||
}
|
||||
|
||||
.shortcuts-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.shortcuts-header h2 {
|
||||
margin: 0;
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.shortcuts-close {
|
||||
display: flex;
|
||||
padding: 4px;
|
||||
color: var(--vp-c-text-2);
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.shortcuts-close:hover,
|
||||
.shortcuts-close:focus-visible {
|
||||
color: var(--vp-c-text-1);
|
||||
background: var(--vp-c-default-soft);
|
||||
}
|
||||
|
||||
.shortcuts-close svg {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.shortcuts-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.shortcut-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.shortcut-keys {
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
order: 2;
|
||||
}
|
||||
|
||||
.shortcut-description {
|
||||
margin: 0;
|
||||
color: var(--vp-c-text-2);
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.shortcut-plus,
|
||||
.shortcut-or {
|
||||
color: var(--vp-c-text-3);
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.shortcut-or {
|
||||
margin: 0 4px;
|
||||
}
|
||||
</style>
|
||||
@@ -89,6 +89,7 @@ function onReset() {
|
||||
<InputField
|
||||
id="non-scaling-stroke"
|
||||
label="Non-scaling stroke"
|
||||
class="non-scaling-stroke-switch"
|
||||
>
|
||||
<Switch
|
||||
id="non-scaling-stroke-switch"
|
||||
|
||||
@@ -173,3 +173,12 @@
|
||||
0% 0%;
|
||||
}
|
||||
}
|
||||
|
||||
/* Keep the copy confetti even with reduced motion turned on (owner request): the site-wide
|
||||
reduced-motion rule in style.css shrinks every animation to 0.01ms, which hid it at once. */
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.confetti-button.animate:before,
|
||||
.confetti-button.animate:after {
|
||||
animation-duration: 1s !important;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import { EXTERNAL_LIBS_CONTEXT, externalLibContext } from './composables/useExte
|
||||
import SideBarNavBefore from './layouts/SideBarNavBefore.vue';
|
||||
import NavBarSponsorButton from './layouts/NavBarSponsorButton.vue';
|
||||
import SnackPlayer from './components/editors/SnackPlayer.vue';
|
||||
import Toaster from './components/base/Toaster.vue';
|
||||
import { setupTracking } from './utils/openpanel';
|
||||
import trackUnderlineDirection from './utils/underlineDirection';
|
||||
|
||||
@@ -25,6 +26,7 @@ const theme: Partial<Theme> = {
|
||||
'sidebar-nav-after': () => h(IconsSidebarNavAfter),
|
||||
'home-hero-image': () => h(HomeHeroIconsCard),
|
||||
'home-hero-actions-after': () => h(HomeHeroAfter),
|
||||
'layout-bottom': () => h(Toaster),
|
||||
'nav-bar-content-after': () => h(NavBarSponsorButton),
|
||||
// Keep this here for now, we might want to add more things to the top bar in the future
|
||||
// 'layout-top': () => h(LayoutTop),
|
||||
|
||||
@@ -1,18 +1,21 @@
|
||||
<script setup>
|
||||
import { useData } from 'vitepress'
|
||||
import { computed } from 'vue';
|
||||
import { useData } from 'vitepress';
|
||||
import SidebarIconCustomizer from '../components/icons/SidebarIconCustomizer.vue';
|
||||
import ExternalLibrarySelect from '../components/icons/SidebarExternalLibrarySelect.vue';
|
||||
import CategoryList from '../components/icons/CategoryList.vue';
|
||||
import KeyboardShortcuts from '../components/icons/KeyboardShortcuts.vue';
|
||||
|
||||
import CategoryList from '../components/icons/CategoryList.vue'
|
||||
import SidebarIconCustomizer from '../components/icons/SidebarIconCustomizer.vue'
|
||||
import ExternalLibrarySelect from '../components/icons/SidebarExternalLibrarySelect.vue'
|
||||
|
||||
const { page } = useData()
|
||||
const { page } = useData();
|
||||
|
||||
const isIconsPage = computed(() => page.value?.relativePath?.startsWith?.('icons'));
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<SidebarIconCustomizer v-if="page?.relativePath?.startsWith?.('icons')"/>
|
||||
<ExternalLibrarySelect v-if="page?.relativePath?.startsWith?.('icons')"/>
|
||||
<CategoryList v-if="page?.relativePath?.startsWith?.('icons')"/>
|
||||
<div v-if="isIconsPage">
|
||||
<SidebarIconCustomizer />
|
||||
<ExternalLibrarySelect />
|
||||
<CategoryList />
|
||||
<KeyboardShortcuts />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -385,6 +385,12 @@ html.dark .VPNav .VPSwitchAppearance .icon .moon {
|
||||
transition: transform 0.3s cubic-bezier(0.34, 1.4, 0.64, 1);
|
||||
}
|
||||
|
||||
@media (min-width: 960px) {
|
||||
.VPSidebar {
|
||||
padding-right: 24px !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Links in the page text: a faint underline shows they are links, and on hover a solid
|
||||
underline draws in from the left. Drawn with backgrounds so it also follows links that
|
||||
wrap onto a second line. */
|
||||
|
||||
@@ -11,7 +11,7 @@ const allowedAttrs = [
|
||||
'class',
|
||||
];
|
||||
|
||||
export default function getSVGIcon(element?: HTMLElement, attrs?: Record<string, string>) {
|
||||
export default function getSVGIcon(element?: Element, attrs?: Record<string, string>) {
|
||||
const svg = element ?? document.querySelector('#previewer svg');
|
||||
if (!svg) return;
|
||||
|
||||
|
||||
@@ -14,6 +14,8 @@ export default function useSearchShortcut(callback: () => void) {
|
||||
// Check for Cmd+K (Mac), Ctrl+K (Windows/Linux), or forward slash
|
||||
if (((event.metaKey || event.ctrlKey) && event.key === 'k') || event.key === '/') {
|
||||
event.preventDefault();
|
||||
// Algolia listens for the same keys on window, so claim them before it sees them
|
||||
event.stopImmediatePropagation();
|
||||
callback();
|
||||
}
|
||||
}
|
||||
@@ -24,11 +26,11 @@ export default function useSearchShortcut(callback: () => void) {
|
||||
shortcutText.value = isMac ? '⌘K' : 'Ctrl+K';
|
||||
|
||||
// Add keyboard shortcut listener
|
||||
window.addEventListener('keydown', handleKeydown);
|
||||
window.addEventListener('keydown', handleKeydown, { capture: true });
|
||||
});
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
window.removeEventListener('keydown', handleKeydown);
|
||||
window.removeEventListener('keydown', handleKeydown, { capture: true });
|
||||
});
|
||||
|
||||
return { shortcutText };
|
||||
|
||||
@@ -77,6 +77,7 @@
|
||||
"react": "19.3.1",
|
||||
"react-dom": "19.3.1",
|
||||
"sandpack-vue3": "3.1.12",
|
||||
"vue": "^3.5.44"
|
||||
"vue": "^3.5.44",
|
||||
"vue-sonner": "^2.0.9"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,10 @@
|
||||
"presentation",
|
||||
"reporting",
|
||||
"data visualisation",
|
||||
"visualisation"
|
||||
"visualisation",
|
||||
"analyze",
|
||||
"kpi",
|
||||
"metrics",
|
||||
"insights"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
"valid",
|
||||
"ticked",
|
||||
"task",
|
||||
"todo"
|
||||
"todo",
|
||||
"selected",
|
||||
"okay",
|
||||
"ok"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
"tags": [
|
||||
"coding",
|
||||
"programming",
|
||||
"development"
|
||||
"development",
|
||||
"developer",
|
||||
"dev"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"$schema": "../group.schema.json",
|
||||
"description": "Style: drawn with a dashed or dotted line",
|
||||
"tags": [
|
||||
"dashed",
|
||||
"dotted",
|
||||
"broken line"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"$schema": "../group.schema.json",
|
||||
"description": "Subject: a face showing an emotion",
|
||||
"tags": [
|
||||
"emoji",
|
||||
"emotion",
|
||||
"mood",
|
||||
"feeling",
|
||||
"expression",
|
||||
"reaction"
|
||||
]
|
||||
}
|
||||
@@ -13,6 +13,11 @@
|
||||
"hazard",
|
||||
"exclamation mark",
|
||||
"exclamation point",
|
||||
"!"
|
||||
"!",
|
||||
"critical",
|
||||
"urgent",
|
||||
"severity",
|
||||
"punctuation",
|
||||
"symbol"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"outgoing",
|
||||
"export",
|
||||
"leave",
|
||||
"egress"
|
||||
"egress",
|
||||
"exit"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -3,19 +3,32 @@
|
||||
"description": "Status: help, or something unknown",
|
||||
"tags": [
|
||||
"help",
|
||||
"assistance",
|
||||
"support",
|
||||
"guide",
|
||||
"tutorial",
|
||||
"manual",
|
||||
"faq",
|
||||
"hint",
|
||||
"query",
|
||||
"unknown",
|
||||
"unidentified",
|
||||
"unspecified",
|
||||
"uncertain",
|
||||
"unsure",
|
||||
"doubt",
|
||||
"undetermined",
|
||||
"missing",
|
||||
"to be determined",
|
||||
"mystery",
|
||||
"question",
|
||||
"question mark",
|
||||
"?"
|
||||
"?",
|
||||
"quiz",
|
||||
"inquiry",
|
||||
"enquiry",
|
||||
"ask",
|
||||
"punctuation",
|
||||
"symbol"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
"lens",
|
||||
"zoom",
|
||||
"inspection",
|
||||
"visual search"
|
||||
"visual search",
|
||||
"loupe"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
"member",
|
||||
"client",
|
||||
"participant",
|
||||
"guest"
|
||||
"guest",
|
||||
"customer",
|
||||
"username"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
"cross",
|
||||
"times",
|
||||
"ex",
|
||||
"×"
|
||||
"×",
|
||||
"deny",
|
||||
"decline",
|
||||
"refuse"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -190,6 +190,7 @@
|
||||
"$group:code",
|
||||
"$group:cog",
|
||||
"$group:currency",
|
||||
"$group:dashed",
|
||||
"$group:digit",
|
||||
"$group:direction-down",
|
||||
"$group:direction-down-left",
|
||||
@@ -200,6 +201,7 @@
|
||||
"$group:direction-up-left",
|
||||
"$group:direction-up-right",
|
||||
"$group:dot",
|
||||
"$group:emoticon",
|
||||
"$group:enter",
|
||||
"$group:exclamation-mark",
|
||||
"$group:exit",
|
||||
|
||||
@@ -24,7 +24,9 @@
|
||||
"code",
|
||||
"glob pattern",
|
||||
"wildcard",
|
||||
"*"
|
||||
"*",
|
||||
"required",
|
||||
"mandatory"
|
||||
],
|
||||
"categories": [
|
||||
"text",
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"$schema": "../icon.schema.json",
|
||||
"contributors": [
|
||||
"KesleyDavid",
|
||||
"karsa-mistmere"
|
||||
],
|
||||
"use-cases": [
|
||||
"Marking interoperable Fediverse profile links in social clients",
|
||||
"Representing a three-star typographic symbol in publishing tools",
|
||||
"Separating article sections with a decorative typographic mark",
|
||||
"Representing star patterns in astronomy apps"
|
||||
],
|
||||
"tags": [
|
||||
"asterisk",
|
||||
"fediverse",
|
||||
"activitypub",
|
||||
"symbol",
|
||||
"typography",
|
||||
"social",
|
||||
"decentralized",
|
||||
"federation",
|
||||
"stars",
|
||||
"three",
|
||||
"ornament",
|
||||
"punctuation",
|
||||
"divider"
|
||||
],
|
||||
"categories": [
|
||||
"text"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M12 2v8" />
|
||||
<path d="m14.5 15 7 4" />
|
||||
<path d="m14.5 19 7-4" />
|
||||
<path d="M18 13v8" />
|
||||
<path d="m2.5 15 7 4" />
|
||||
<path d="m2.5 19 7-4" />
|
||||
<path d="M6 13v8" />
|
||||
<path d="m8.5 4 7 4" />
|
||||
<path d="m8.5 8 7-4" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 440 B |
@@ -10,7 +10,10 @@
|
||||
"badge",
|
||||
"rosette",
|
||||
"prize",
|
||||
"winner"
|
||||
"winner",
|
||||
"skill",
|
||||
"skills",
|
||||
"expertise"
|
||||
],
|
||||
"categories": [
|
||||
"account",
|
||||
|
||||
@@ -14,7 +14,13 @@
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$extends:badge",
|
||||
"$group:check"
|
||||
"$group:check",
|
||||
"premium",
|
||||
"vip",
|
||||
"exclusive",
|
||||
"pro",
|
||||
"guarantee",
|
||||
"warranty"
|
||||
],
|
||||
"categories": [
|
||||
"social"
|
||||
|
||||
@@ -7,7 +7,11 @@
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$extends:badge",
|
||||
"$group:percent"
|
||||
"$group:percent",
|
||||
"sell",
|
||||
"selling",
|
||||
"promotion",
|
||||
"promo"
|
||||
],
|
||||
"categories": [
|
||||
"finance",
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z" />
|
||||
<path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" />
|
||||
<line x1="12" x2="12.01" y1="17" y2="17" />
|
||||
<path d="M9 9.5a3 2.5 0 016 0c0 2-2 2-3 3.5" />
|
||||
<path d="M12 17h.01" />
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 481 B After Width: | Height: | Size: 459 B |
@@ -21,7 +21,8 @@
|
||||
"emergency",
|
||||
"aid",
|
||||
"safety",
|
||||
"patch"
|
||||
"patch",
|
||||
"patient"
|
||||
],
|
||||
"categories": [
|
||||
"medical"
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
"cash",
|
||||
"funds",
|
||||
"transaction",
|
||||
"finance"
|
||||
"finance",
|
||||
"salary"
|
||||
],
|
||||
"categories": [
|
||||
"finance"
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M10 17h.01" />
|
||||
<path d="M10 7v6" />
|
||||
<path d="M10 16h.01" />
|
||||
<path d="M10 8v4" />
|
||||
<path d="M14 6h2a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2" />
|
||||
<path d="M22 14v-4" />
|
||||
<path d="M6 18H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h2" />
|
||||
|
||||
|
Before Width: | Height: | Size: 393 B After Width: | Height: | Size: 393 B |
@@ -7,6 +7,7 @@
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$extends:book",
|
||||
"$group:dashed",
|
||||
"code",
|
||||
"coding",
|
||||
"version control",
|
||||
|
||||
@@ -6,7 +6,10 @@
|
||||
],
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$extends:book-open"
|
||||
"$extends:book-open",
|
||||
"docs",
|
||||
"wiki",
|
||||
"knowledge base"
|
||||
],
|
||||
"categories": [
|
||||
"text",
|
||||
|
||||
@@ -5,7 +5,10 @@
|
||||
],
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$extends:book"
|
||||
"$extends:book",
|
||||
"docs",
|
||||
"wiki",
|
||||
"knowledge base"
|
||||
],
|
||||
"categories": [
|
||||
"text",
|
||||
|
||||
@@ -24,7 +24,10 @@
|
||||
"smart",
|
||||
"deep learning",
|
||||
"machine learning",
|
||||
"computing"
|
||||
"computing",
|
||||
"skill",
|
||||
"skills",
|
||||
"expertise"
|
||||
],
|
||||
"categories": [
|
||||
"medical",
|
||||
|
||||
@@ -20,8 +20,6 @@
|
||||
"briefcase",
|
||||
"portfolio",
|
||||
"business",
|
||||
"career",
|
||||
"employment",
|
||||
"professional"
|
||||
],
|
||||
"categories": [
|
||||
|
||||
@@ -10,7 +10,12 @@
|
||||
"work",
|
||||
"bag",
|
||||
"baggage",
|
||||
"folder"
|
||||
"folder",
|
||||
"job",
|
||||
"career",
|
||||
"employment",
|
||||
"hiring",
|
||||
"experience"
|
||||
],
|
||||
"categories": [
|
||||
"travel"
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"count",
|
||||
"calculating machine"
|
||||
"calculating machine",
|
||||
"budget"
|
||||
],
|
||||
"categories": [
|
||||
"math",
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
"singular",
|
||||
"once",
|
||||
"1",
|
||||
"first"
|
||||
"first",
|
||||
"today"
|
||||
],
|
||||
"categories": [
|
||||
"$extends:calendar"
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
"$extends:calendar",
|
||||
"$group:check",
|
||||
"subscribe",
|
||||
"schedule"
|
||||
"schedule",
|
||||
"today"
|
||||
],
|
||||
"categories": [
|
||||
"$extends:calendar"
|
||||
|
||||
@@ -6,7 +6,9 @@
|
||||
],
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$extends:calendar"
|
||||
"$extends:calendar",
|
||||
"week",
|
||||
"weekly"
|
||||
],
|
||||
"categories": [
|
||||
"$extends:calendar"
|
||||
|
||||
@@ -8,7 +8,9 @@
|
||||
"tags": [
|
||||
"$extends:calendar",
|
||||
"range",
|
||||
"period"
|
||||
"period",
|
||||
"week",
|
||||
"weekly"
|
||||
],
|
||||
"categories": [
|
||||
"$extends:calendar"
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
"mineral",
|
||||
"pentagon",
|
||||
"multidimensional",
|
||||
"metrics",
|
||||
"performance",
|
||||
"comparison",
|
||||
"profile",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$group:direction-down-left",
|
||||
"outwards"
|
||||
"$group:exit"
|
||||
],
|
||||
"categories": [
|
||||
"arrows"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$group:direction-down-right",
|
||||
"outwards"
|
||||
"$group:exit"
|
||||
],
|
||||
"categories": [
|
||||
"arrows"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$group:direction-up-left",
|
||||
"outwards",
|
||||
"$group:exit",
|
||||
"keyboard",
|
||||
"button",
|
||||
"escape"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$group:direction-up-right",
|
||||
"outwards"
|
||||
"$group:exit"
|
||||
],
|
||||
"categories": [
|
||||
"arrows"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
],
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$group:dashed",
|
||||
"pending",
|
||||
"dot",
|
||||
"progress",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
],
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$group:dashed",
|
||||
"pending",
|
||||
"progress",
|
||||
"issue",
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="10" />
|
||||
<path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" />
|
||||
<path d="M9 9.5a3 2.5 0 016 0c0 2-2 2-3 3.5" />
|
||||
<path d="M12 17h.01" />
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 322 B After Width: | Height: | Size: 320 B |
@@ -10,7 +10,9 @@
|
||||
"$extends:clipboard",
|
||||
"$group:check",
|
||||
"copied",
|
||||
"pasted"
|
||||
"pasted",
|
||||
"result",
|
||||
"checklist"
|
||||
],
|
||||
"categories": [
|
||||
"$extends:clipboard"
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$extends:clipboard",
|
||||
"tasks"
|
||||
"tasks",
|
||||
"checklist"
|
||||
],
|
||||
"categories": [
|
||||
"$extends:clipboard"
|
||||
|
||||
@@ -8,7 +8,9 @@
|
||||
],
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"import"
|
||||
"import",
|
||||
"install",
|
||||
"installation"
|
||||
],
|
||||
"categories": [
|
||||
"arrows",
|
||||
|
||||
@@ -9,7 +9,10 @@
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$extends:cloud",
|
||||
"bolt"
|
||||
"bolt",
|
||||
"thunder",
|
||||
"thunderstorm",
|
||||
"thunderbolt"
|
||||
],
|
||||
"categories": [
|
||||
"$extends:cloud"
|
||||
|
||||
@@ -9,7 +9,9 @@
|
||||
],
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"file"
|
||||
"file",
|
||||
"deploy",
|
||||
"deployment"
|
||||
],
|
||||
"categories": [
|
||||
"arrows",
|
||||
|
||||
@@ -10,7 +10,9 @@
|
||||
"bank",
|
||||
"purchase",
|
||||
"payment",
|
||||
"cc"
|
||||
"cc",
|
||||
"cashier",
|
||||
"merchant"
|
||||
],
|
||||
"categories": [
|
||||
"account",
|
||||
|
||||
@@ -16,7 +16,11 @@
|
||||
"ruler",
|
||||
"winner",
|
||||
"favorite",
|
||||
"favourite"
|
||||
"favourite",
|
||||
"premium",
|
||||
"vip",
|
||||
"exclusive",
|
||||
"pro"
|
||||
],
|
||||
"categories": [
|
||||
"gaming"
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
"egress",
|
||||
"gate",
|
||||
"gateway",
|
||||
"emergency exit"
|
||||
"emergency exit",
|
||||
"quit"
|
||||
],
|
||||
"categories": [
|
||||
"home",
|
||||
|
||||
@@ -10,7 +10,9 @@
|
||||
"import",
|
||||
"export",
|
||||
"save",
|
||||
"pull"
|
||||
"pull",
|
||||
"install",
|
||||
"installation"
|
||||
],
|
||||
"categories": [
|
||||
"arrows",
|
||||
|
||||
@@ -11,7 +11,11 @@
|
||||
"browser",
|
||||
"language",
|
||||
"translate",
|
||||
"globe"
|
||||
"globe",
|
||||
"www",
|
||||
"http",
|
||||
"https",
|
||||
"website"
|
||||
],
|
||||
"categories": [
|
||||
"navigation"
|
||||
|
||||
@@ -14,7 +14,11 @@
|
||||
"overflow",
|
||||
"dots",
|
||||
"…",
|
||||
"..."
|
||||
"...",
|
||||
"kebab",
|
||||
"kebab menu",
|
||||
"three dots",
|
||||
"3 dots"
|
||||
],
|
||||
"categories": [
|
||||
"layout"
|
||||
|
||||
@@ -25,7 +25,10 @@
|
||||
"overflow",
|
||||
"dots",
|
||||
"…",
|
||||
"..."
|
||||
"...",
|
||||
"meatball menu",
|
||||
"three dots",
|
||||
"3 dots"
|
||||
],
|
||||
"categories": [
|
||||
"layout",
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"$schema": "../icon.schema.json",
|
||||
"contributors": [
|
||||
"karsa-mistmere",
|
||||
"danielbayley",
|
||||
"lt25106"
|
||||
],
|
||||
"use-cases": [
|
||||
"Highlighting warnings or errors in user interfaces",
|
||||
"Marking important notices that need attention"
|
||||
],
|
||||
"tags": [
|
||||
"$group:exclamation-mark",
|
||||
"bang",
|
||||
"surprise",
|
||||
"emphasis",
|
||||
"interjection",
|
||||
"factorial",
|
||||
"negation"
|
||||
],
|
||||
"categories": [
|
||||
"letters-digits",
|
||||
"text",
|
||||
"notifications"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M12 15V4" />
|
||||
<path d="M12 20h.01" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 258 B |
@@ -9,7 +9,8 @@
|
||||
"tags": [
|
||||
"outbound",
|
||||
"open",
|
||||
"share"
|
||||
"share",
|
||||
"redirect"
|
||||
],
|
||||
"categories": [
|
||||
"arrows",
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
],
|
||||
"tags": [
|
||||
"$extends:eye",
|
||||
"$group:dashed",
|
||||
"hide",
|
||||
"conceal",
|
||||
"mask",
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
"visibility",
|
||||
"vision",
|
||||
"preview",
|
||||
"read"
|
||||
"read",
|
||||
"eyes"
|
||||
],
|
||||
"categories": [
|
||||
"accessibility",
|
||||
|
||||
@@ -6,14 +6,13 @@
|
||||
],
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$group:emoticon",
|
||||
"anger",
|
||||
"rage",
|
||||
"fury",
|
||||
"resentment",
|
||||
"irritation",
|
||||
"disgust",
|
||||
"emoji",
|
||||
"emotion"
|
||||
"disgust"
|
||||
],
|
||||
"categories": [
|
||||
"emoji"
|
||||
|
||||
@@ -5,12 +5,11 @@
|
||||
],
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$group:emoticon",
|
||||
"nuisance",
|
||||
"annoyed",
|
||||
"annoyance",
|
||||
"frustration",
|
||||
"emoji",
|
||||
"emotion"
|
||||
"frustration"
|
||||
],
|
||||
"categories": [
|
||||
"emoji"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
],
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$group:emoticon",
|
||||
"happy",
|
||||
"happiness",
|
||||
"good",
|
||||
@@ -14,9 +15,7 @@
|
||||
"pleasure",
|
||||
"good cheer",
|
||||
"humour",
|
||||
"funny",
|
||||
"emoji",
|
||||
"emotion"
|
||||
"funny"
|
||||
],
|
||||
"categories": [
|
||||
"emoji"
|
||||
|
||||
@@ -8,9 +8,8 @@
|
||||
],
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"emoji",
|
||||
"$group:emoticon",
|
||||
"neutral",
|
||||
"emotion",
|
||||
"meh",
|
||||
"blank stare",
|
||||
"social masking",
|
||||
|
||||
@@ -8,10 +8,9 @@
|
||||
],
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"emoji",
|
||||
"$group:emoticon",
|
||||
"bad",
|
||||
"sadness",
|
||||
"emotion",
|
||||
"concern",
|
||||
"disappointment"
|
||||
],
|
||||
|
||||
@@ -9,8 +9,7 @@
|
||||
"$extends:face-slightly-smiling",
|
||||
"$extends:group",
|
||||
"$group:plus",
|
||||
"react",
|
||||
"reaction"
|
||||
"react"
|
||||
],
|
||||
"categories": [
|
||||
"emoji",
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
],
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"$group:emoticon",
|
||||
"smile",
|
||||
"happy",
|
||||
"happiness",
|
||||
@@ -16,9 +17,7 @@
|
||||
"friendly",
|
||||
"patronizing",
|
||||
"passive aggressive",
|
||||
"ironic",
|
||||
"emoji",
|
||||
"emotion"
|
||||
"ironic"
|
||||
],
|
||||
"categories": [
|
||||
"emoji"
|
||||
|
||||
@@ -9,7 +9,10 @@
|
||||
"tags": [
|
||||
"$extends:file",
|
||||
"$group:question-mark",
|
||||
"readme"
|
||||
"readme",
|
||||
"404",
|
||||
"not found",
|
||||
"page not found"
|
||||
],
|
||||
"categories": [
|
||||
"$extends:file"
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" />
|
||||
<path d="M9 9.5a3 2.5 0 016 0c0 2-2 2-3 3.5" />
|
||||
<path d="M12 17h.01" />
|
||||
<path d="M9.1 9a3 3 0 0 1 5.82 1c0 2-3 3-3 3" />
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 411 B After Width: | Height: | Size: 410 B |
@@ -9,7 +9,11 @@
|
||||
"$extends:file",
|
||||
"spreadsheet",
|
||||
"sheet",
|
||||
"table"
|
||||
"table",
|
||||
"csv",
|
||||
"xls",
|
||||
"xlsx",
|
||||
"excel"
|
||||
],
|
||||
"categories": [
|
||||
"$extends:file"
|
||||
|
||||
@@ -10,7 +10,11 @@
|
||||
"$extends:file",
|
||||
"data",
|
||||
"txt",
|
||||
"pdf"
|
||||
"pdf",
|
||||
"doc",
|
||||
"docx",
|
||||
"word",
|
||||
"docs"
|
||||
],
|
||||
"categories": [
|
||||
"$extends:file",
|
||||
|
||||
@@ -12,7 +12,10 @@
|
||||
"tags": [
|
||||
"$extends:file",
|
||||
"$group:x",
|
||||
"lost"
|
||||
"lost",
|
||||
"404",
|
||||
"not found",
|
||||
"page not found"
|
||||
],
|
||||
"categories": [
|
||||
"$extends:file"
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
"tags": [
|
||||
"send",
|
||||
"share",
|
||||
"email"
|
||||
"email",
|
||||
"redirect"
|
||||
],
|
||||
"categories": [
|
||||
"mail"
|
||||
|
||||
@@ -19,7 +19,11 @@
|
||||
"wedding",
|
||||
"proposal",
|
||||
"marriage",
|
||||
"rubygems"
|
||||
"rubygems",
|
||||
"premium",
|
||||
"vip",
|
||||
"exclusive",
|
||||
"pro"
|
||||
],
|
||||
"categories": [
|
||||
"gaming",
|
||||
|
||||
@@ -8,7 +8,9 @@
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"code",
|
||||
"version control"
|
||||
"version control",
|
||||
"ci/cd",
|
||||
"cicd"
|
||||
],
|
||||
"categories": [
|
||||
"development"
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
"$extends:globe",
|
||||
"$group:off",
|
||||
"web",
|
||||
"website",
|
||||
"banned",
|
||||
"geo blocking",
|
||||
"offline",
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
"tags": [
|
||||
"$extends:globe",
|
||||
"$group:code",
|
||||
"website",
|
||||
"digital",
|
||||
"access",
|
||||
"link"
|
||||
|
||||
@@ -21,7 +21,11 @@
|
||||
"globe",
|
||||
"internet",
|
||||
"planet",
|
||||
"network"
|
||||
"network",
|
||||
"www",
|
||||
"http",
|
||||
"https",
|
||||
"website"
|
||||
],
|
||||
"categories": [
|
||||
"navigation",
|
||||
|
||||
@@ -7,7 +7,11 @@
|
||||
"use-cases": [],
|
||||
"tags": [
|
||||
"flag",
|
||||
"bullseye"
|
||||
"bullseye",
|
||||
"result",
|
||||
"outcome",
|
||||
"objective",
|
||||
"okr"
|
||||
],
|
||||
"categories": [
|
||||
"gaming"
|
||||
|
||||
@@ -20,7 +20,10 @@
|
||||
"diploma",
|
||||
"bachelor's",
|
||||
"master's",
|
||||
"doctorate"
|
||||
"doctorate",
|
||||
"skill",
|
||||
"skills",
|
||||
"expertise"
|
||||
],
|
||||
"categories": [
|
||||
"buildings"
|
||||
|
||||
@@ -19,7 +19,12 @@
|
||||
"allowance",
|
||||
"pocket money",
|
||||
"handout",
|
||||
"pennies"
|
||||
"pennies",
|
||||
"loan",
|
||||
"lending",
|
||||
"borrow",
|
||||
"debt",
|
||||
"salary"
|
||||
],
|
||||
"categories": [
|
||||
"finance"
|
||||
|
||||
@@ -8,7 +8,13 @@
|
||||
"wave",
|
||||
"move",
|
||||
"mouse",
|
||||
"grab"
|
||||
"grab",
|
||||
"welcome",
|
||||
"hello",
|
||||
"hi",
|
||||
"greeting",
|
||||
"goodbye",
|
||||
"bye"
|
||||
],
|
||||
"categories": [
|
||||
"cursors",
|
||||
|
||||
@@ -16,7 +16,10 @@
|
||||
"phone",
|
||||
"telephone",
|
||||
"voip",
|
||||
"video"
|
||||
"video",
|
||||
"customer service",
|
||||
"customer support",
|
||||
"helpdesk"
|
||||
],
|
||||
"categories": [
|
||||
"multimedia",
|
||||
|
||||
@@ -14,7 +14,8 @@
|
||||
"terms",
|
||||
"emotion",
|
||||
"together",
|
||||
"handshake"
|
||||
"handshake",
|
||||
"insurance"
|
||||
],
|
||||
"categories": [
|
||||
"emoji",
|
||||
|
||||
@@ -16,7 +16,9 @@
|
||||
"ward",
|
||||
"building",
|
||||
"medical",
|
||||
"vet"
|
||||
"vet",
|
||||
"sick",
|
||||
"patient"
|
||||
],
|
||||
"categories": [
|
||||
"medical",
|
||||
|
||||