init
@@ -0,0 +1,18 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
env: { browser: true, es2020: true },
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'plugin:react-hooks/recommended',
|
||||
],
|
||||
ignorePatterns: ['dist', '.eslintrc.cjs'],
|
||||
parser: '@typescript-eslint/parser',
|
||||
plugins: ['react-refresh'],
|
||||
rules: {
|
||||
'react-refresh/only-export-components': [
|
||||
'warn',
|
||||
{ allowConstantExport: true },
|
||||
],
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
@@ -0,0 +1,30 @@
|
||||
# React + TypeScript + Vite
|
||||
|
||||
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
||||
|
||||
Currently, two official plugins are available:
|
||||
|
||||
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
|
||||
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
||||
|
||||
## Expanding the ESLint configuration
|
||||
|
||||
If you are developing a production application, we recommend updating the configuration to enable type aware lint rules:
|
||||
|
||||
- Configure the top-level `parserOptions` property like this:
|
||||
|
||||
```js
|
||||
export default {
|
||||
// other rules...
|
||||
parserOptions: {
|
||||
ecmaVersion: 'latest',
|
||||
sourceType: 'module',
|
||||
project: ['./tsconfig.json', './tsconfig.node.json'],
|
||||
tsconfigRootDir: __dirname,
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`
|
||||
- Optionally add `plugin:@typescript-eslint/stylistic-type-checked`
|
||||
- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list
|
||||
@@ -0,0 +1,14 @@
|
||||
<!doctype html>
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link rel="shortcut icon" href="https://s11.ax1x.com/2023/12/19/piIwxyt.png">
|
||||
|
||||
<title>CyyNote</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.tsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,80 @@
|
||||
|
||||
{
|
||||
"name": "cyynote",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@alkhipce/editorjs-react": "^0.1.4",
|
||||
"@blocknote/core": "^0.10.0",
|
||||
"@blocknote/react": "^0.10.0",
|
||||
"@douyinfe/semi-icons": "^2.48.0",
|
||||
"@douyinfe/semi-icons-lab": "^2.48.0",
|
||||
"@douyinfe/semi-ui": "^2.48.0",
|
||||
"@editorjs/checklist": "^1.6.0",
|
||||
"@editorjs/code": "^2.9.0",
|
||||
"@editorjs/delimiter": "^1.4.0",
|
||||
"@editorjs/editorjs": "^2.28.2",
|
||||
"@editorjs/embed": "^2.7.0",
|
||||
"@editorjs/header": "^2.8.1",
|
||||
"@editorjs/image": "^2.9.0",
|
||||
"@editorjs/inline-code": "^1.5.0",
|
||||
"@editorjs/link": "^2.6.2",
|
||||
"@editorjs/list": "^1.9.0",
|
||||
"@editorjs/marker": "^1.4.0",
|
||||
"@editorjs/paragraph": "^2.11.3",
|
||||
"@editorjs/quote": "^2.6.0",
|
||||
"@editorjs/raw": "^2.5.0",
|
||||
"@editorjs/simple-image": "^1.6.0",
|
||||
"@editorjs/table": "^2.3.0",
|
||||
"@editorjs/warning": "^1.4.0",
|
||||
"@excalidraw/excalidraw": "^0.17.2",
|
||||
"@lexical/clipboard": "^0.12.5",
|
||||
"@lexical/code": "^0.12.5",
|
||||
"@lexical/file": "^0.12.5",
|
||||
"@lexical/hashtag": "^0.12.5",
|
||||
"@lexical/link": "^0.12.5",
|
||||
"@lexical/list": "^0.12.5",
|
||||
"@lexical/mark": "^0.12.5",
|
||||
"@lexical/overflow": "^0.12.5",
|
||||
"@lexical/plain-text": "^0.12.5",
|
||||
"@lexical/react": "^0.12.5",
|
||||
"@lexical/rich-text": "^0.12.5",
|
||||
"@lexical/selection": "^0.12.5",
|
||||
"@lexical/table": "^0.12.5",
|
||||
"@lexical/utils": "^0.12.5",
|
||||
"axios": "^1.6.2",
|
||||
"editorjs-html": "^3.4.3",
|
||||
"formik": "^2.4.5",
|
||||
"html-react-parser": "^5.0.7",
|
||||
"katex": "^0.16.9",
|
||||
"lexical": "^0.12.5",
|
||||
"prettier": "^3.1.0",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-editor-js": "^2.1.0",
|
||||
"react-router-dom": "^6.20.1",
|
||||
"sass": "^1.69.5",
|
||||
"y-websocket": "^1.5.0",
|
||||
"yjs": "^13.6.10",
|
||||
"yup": "^1.3.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^18.2.37",
|
||||
"@types/react-dom": "^18.2.15",
|
||||
"@typescript-eslint/eslint-plugin": "^6.10.0",
|
||||
"@typescript-eslint/parser": "^6.10.0",
|
||||
"@vitejs/plugin-react": "^4.2.0",
|
||||
"eslint": "^8.53.0",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
"eslint-plugin-react-refresh": "^0.4.4",
|
||||
"typescript": "^5.2.2",
|
||||
"vite": "^5.0.0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1,42 @@
|
||||
/*#root {*/
|
||||
/* max-width: 1280px;*/
|
||||
/* margin: 0 auto;*/
|
||||
/* padding: 2rem;*/
|
||||
/* text-align: center;*/
|
||||
/*}*/
|
||||
|
||||
/*.logo {*/
|
||||
/* height: 6em;*/
|
||||
/* padding: 1.5em;*/
|
||||
/* will-change: filter;*/
|
||||
/* transition: filter 300ms;*/
|
||||
/*}*/
|
||||
/*.logo:hover {*/
|
||||
/* filter: drop-shadow(0 0 2em #646cffaa);*/
|
||||
/*}*/
|
||||
/*.logo.react:hover {*/
|
||||
/* filter: drop-shadow(0 0 2em #61dafbaa);*/
|
||||
/*}*/
|
||||
|
||||
/*@keyframes logo-spin {*/
|
||||
/* from {*/
|
||||
/* transform: rotate(0deg);*/
|
||||
/* }*/
|
||||
/* to {*/
|
||||
/* transform: rotate(360deg);*/
|
||||
/* }*/
|
||||
/*}*/
|
||||
|
||||
/*@media (prefers-reduced-motion: no-preference) {*/
|
||||
/* a:nth-of-type(2) .logo {*/
|
||||
/* animation: logo-spin infinite 20s linear;*/
|
||||
/* }*/
|
||||
/*}*/
|
||||
|
||||
/*.card {*/
|
||||
/* padding: 2em;*/
|
||||
/*}*/
|
||||
|
||||
/*.read-the-docs {*/
|
||||
/* color: #888;*/
|
||||
/*}*/
|
||||
@@ -0,0 +1,163 @@
|
||||
import { Component } from "react";
|
||||
import { Routes, Route } from "react-router-dom";
|
||||
import "./App.css";
|
||||
|
||||
import AuthService from "./services/auth.service";
|
||||
import IUser from './types/user.type';
|
||||
|
||||
// import Login from "./components/login.component";
|
||||
import Register from "./components/register.component";
|
||||
// import Home from "./components/home.component";
|
||||
import Profile from "./components/profile.component";
|
||||
import BoardUser from "./components/board-user.component";
|
||||
import BoardModerator from "./components/board-moderator.component";
|
||||
import BoardAdmin from "./components/board-admin.component";
|
||||
|
||||
|
||||
import NotePage from "./pages/note-page.tsx";
|
||||
import EventBus from "./common/EventBus";
|
||||
import SignIn from "./pages/sign-in.tsx";
|
||||
import Test from "./pages/test.tsx";
|
||||
// "build": "tsc && vite build",
|
||||
|
||||
|
||||
type Props = {};
|
||||
|
||||
type State = {
|
||||
showModeratorBoard: boolean,
|
||||
showAdminBoard: boolean,
|
||||
currentUser: IUser | undefined
|
||||
}
|
||||
|
||||
class App extends Component<Props, State> {
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
this.logOut = this.logOut.bind(this);
|
||||
|
||||
this.state = {
|
||||
showModeratorBoard: false,
|
||||
showAdminBoard: false,
|
||||
currentUser: undefined,
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
const user = AuthService.getCurrentUser();
|
||||
|
||||
if (user) {
|
||||
this.setState({
|
||||
currentUser: user,
|
||||
showModeratorBoard: user.roles.includes("ROLE_MODERATOR"),
|
||||
showAdminBoard: user.roles.includes("ROLE_ADMIN"),
|
||||
});
|
||||
}
|
||||
|
||||
EventBus.on("logout", this.logOut);
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
EventBus.remove("logout", this.logOut);
|
||||
}
|
||||
|
||||
logOut() {
|
||||
AuthService.logout();
|
||||
this.setState({
|
||||
showModeratorBoard: false,
|
||||
showAdminBoard: false,
|
||||
currentUser: undefined,
|
||||
});
|
||||
}
|
||||
|
||||
render() {
|
||||
// const { currentUser, showModeratorBoard, showAdminBoard } = this.state;
|
||||
|
||||
return (
|
||||
<div>
|
||||
{/*<nav className="navbar navbar-expand navbar-dark bg-dark">*/}
|
||||
{/* <Link to={"/"} className="navbar-brand">*/}
|
||||
{/* bezKoder*/}
|
||||
{/* </Link>*/}
|
||||
{/* <div className="navbar-nav mr-auto">*/}
|
||||
{/* <li className="nav-item">*/}
|
||||
{/* <Link to={"/home"} className="nav-link">*/}
|
||||
{/* Home*/}
|
||||
{/* </Link>*/}
|
||||
{/* </li>*/}
|
||||
|
||||
{/* {showModeratorBoard && (*/}
|
||||
{/* <li className="nav-item">*/}
|
||||
{/* <Link to={"/mod"} className="nav-link">*/}
|
||||
{/* Moderator Board*/}
|
||||
{/* </Link>*/}
|
||||
{/* </li>*/}
|
||||
{/* )}*/}
|
||||
|
||||
{/* {showAdminBoard && (*/}
|
||||
{/* <li className="nav-item">*/}
|
||||
{/* <Link to={"/admin"} className="nav-link">*/}
|
||||
{/* Admin Board*/}
|
||||
{/* </Link>*/}
|
||||
{/* </li>*/}
|
||||
{/* )}*/}
|
||||
|
||||
{/* {currentUser && (*/}
|
||||
{/* <li className="nav-item">*/}
|
||||
{/* <Link to={"/user"} className="nav-link">*/}
|
||||
{/* User*/}
|
||||
{/* </Link>*/}
|
||||
{/* </li>*/}
|
||||
{/* )}*/}
|
||||
{/* </div>*/}
|
||||
|
||||
{/* {currentUser ? (*/}
|
||||
{/* <div className="navbar-nav ml-auto">*/}
|
||||
{/* <li className="nav-item">*/}
|
||||
{/* <Link to={"/profile"} className="nav-link">*/}
|
||||
{/* {currentUser.username}*/}
|
||||
{/* </Link>*/}
|
||||
{/* </li>*/}
|
||||
{/* <li className="nav-item">*/}
|
||||
{/* <a href="/login" className="nav-link" onClick={this.logOut}>*/}
|
||||
{/* LogOut*/}
|
||||
{/* </a>*/}
|
||||
{/* </li>*/}
|
||||
{/* </div>*/}
|
||||
{/* ) : (*/}
|
||||
{/* <div className="navbar-nav ml-auto">*/}
|
||||
{/* <li className="nav-item">*/}
|
||||
{/* <Link to={"/login"} className="nav-link">*/}
|
||||
{/* Login*/}
|
||||
{/* </Link>*/}
|
||||
{/* </li>*/}
|
||||
|
||||
{/* <li className="nav-item">*/}
|
||||
{/* <Link to={"/register"} className="nav-link">*/}
|
||||
{/* Sign Up*/}
|
||||
{/* </Link>*/}
|
||||
{/* </li>*/}
|
||||
{/* </div>*/}
|
||||
{/* )}*/}
|
||||
{/*</nav>*/}
|
||||
|
||||
<div className="">
|
||||
<Routes>
|
||||
<Route path="/" element={<NotePage />} />
|
||||
<Route path="/home" element={<NotePage />} />
|
||||
<Route path="/login" element={<SignIn />} />
|
||||
|
||||
<Route path="/test" element={<Test />} />
|
||||
<Route path="/register" element={<Register />} />
|
||||
<Route path="/profile" element={<Profile />} />
|
||||
<Route path="/user" element={<BoardUser />} />
|
||||
<Route path="/mod" element={<BoardModerator />} />
|
||||
<Route path="/admin" element={<BoardAdmin />} />
|
||||
</Routes>
|
||||
</div>
|
||||
|
||||
{ /*<AuthVerify logOut={this.logOut}/> */}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default App;
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>
|
||||
|
After Width: | Height: | Size: 4.0 KiB |
@@ -0,0 +1,13 @@
|
||||
const eventBus = {
|
||||
on(event: string, callback: EventListener) {
|
||||
document.addEventListener(event, (e) => callback(e));
|
||||
},
|
||||
dispatch(event: string, data?: any) {
|
||||
document.dispatchEvent(new CustomEvent(event, { detail: data }));
|
||||
},
|
||||
remove(event: string, callback: EventListener) {
|
||||
document.removeEventListener(event, callback);
|
||||
},
|
||||
};
|
||||
|
||||
export default eventBus;
|
||||
@@ -0,0 +1,54 @@
|
||||
import { Component } from "react";
|
||||
|
||||
import UserService from "../services/user.service";
|
||||
import EventBus from "../common/EventBus";
|
||||
|
||||
type Props = {};
|
||||
|
||||
type State = {
|
||||
content: string;
|
||||
}
|
||||
|
||||
export default class BoardAdmin extends Component<Props, State> {
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
|
||||
this.state = {
|
||||
content: ""
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
UserService.getAdminBoard().then(
|
||||
response => {
|
||||
this.setState({
|
||||
content: response.data
|
||||
});
|
||||
},
|
||||
error => {
|
||||
this.setState({
|
||||
content:
|
||||
(error.response &&
|
||||
error.response.data &&
|
||||
error.response.data.message) ||
|
||||
error.message ||
|
||||
error.toString()
|
||||
});
|
||||
|
||||
if (error.response && error.response.status === 401) {
|
||||
EventBus.dispatch("logout");
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<div className="container">
|
||||
<header className="jumbotron">
|
||||
<h3>{this.state.content}</h3>
|
||||
</header>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
import { Component } from "react";
|
||||
|
||||
import UserService from "../services/user.service";
|
||||
import EventBus from "../common/EventBus";
|
||||
|
||||
type Props = {};
|
||||
|
||||
type State = {
|
||||
content: string;
|
||||
}
|
||||
|
||||
export default class BoardAdmin extends Component<Props, State> {
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
|
||||
this.state = {
|
||||
content: ""
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
UserService.getModeratorBoard().then(
|
||||
response => {
|
||||
this.setState({
|
||||
content: response.data
|
||||
});
|
||||
},
|
||||
error => {
|
||||
this.setState({
|
||||
content:
|
||||
(error.response &&
|
||||
error.response.data &&
|
||||
error.response.data.message) ||
|
||||
error.message ||
|
||||
error.toString()
|
||||
});
|
||||
|
||||
if (error.response && error.response.status === 401) {
|
||||
EventBus.dispatch("logout");
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<div className="container">
|
||||
<header className="jumbotron">
|
||||
<h3>{this.state.content}</h3>
|
||||
</header>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
import { Component } from "react";
|
||||
|
||||
import UserService from "../services/user.service";
|
||||
import EventBus from "../common/EventBus";
|
||||
|
||||
type Props = {};
|
||||
|
||||
type State = {
|
||||
content: string;
|
||||
}
|
||||
|
||||
export default class BoardUser extends Component<Props, State> {
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
|
||||
this.state = {
|
||||
content: ""
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
UserService.getUserBoard().then(
|
||||
response => {
|
||||
this.setState({
|
||||
content: response.data
|
||||
});
|
||||
},
|
||||
error => {
|
||||
this.setState({
|
||||
content:
|
||||
(error.response &&
|
||||
error.response.data &&
|
||||
error.response.data.message) ||
|
||||
error.message ||
|
||||
error.toString()
|
||||
});
|
||||
|
||||
if (error.response && error.response.status === 401) {
|
||||
EventBus.dispatch("logout");
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<div className="container">
|
||||
<header className="jumbotron">
|
||||
<h3>{this.state.content}</h3>
|
||||
</header>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
import { Component } from "react";
|
||||
|
||||
import UserService from "../services/user.service";
|
||||
|
||||
type Props = {};
|
||||
|
||||
type State = {
|
||||
content: string;
|
||||
}
|
||||
|
||||
export default class Home extends Component<Props, State> {
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
|
||||
this.state = {
|
||||
content: ""
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
UserService.getPublicContent().then(
|
||||
response => {
|
||||
this.setState({
|
||||
content: response.data
|
||||
});
|
||||
},
|
||||
error => {
|
||||
this.setState({
|
||||
content:
|
||||
(error.response && error.response.data) ||
|
||||
error.message ||
|
||||
error.toString()
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<div className="container">
|
||||
<header className="jumbotron">
|
||||
<h3>{this.state.content}</h3>
|
||||
</header>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,278 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
import {AutoFocusPlugin} from '@lexical/react/LexicalAutoFocusPlugin';
|
||||
import {CharacterLimitPlugin} from '@lexical/react/LexicalCharacterLimitPlugin';
|
||||
import {CheckListPlugin} from '@lexical/react/LexicalCheckListPlugin';
|
||||
import {ClearEditorPlugin} from '@lexical/react/LexicalClearEditorPlugin';
|
||||
import LexicalClickableLinkPlugin from '@lexical/react/LexicalClickableLinkPlugin';
|
||||
import {CollaborationPlugin} from '@lexical/react/LexicalCollaborationPlugin';
|
||||
import LexicalErrorBoundary from '@lexical/react/LexicalErrorBoundary';
|
||||
import {HashtagPlugin} from '@lexical/react/LexicalHashtagPlugin';
|
||||
import {HistoryPlugin} from '@lexical/react/LexicalHistoryPlugin';
|
||||
import {HorizontalRulePlugin} from '@lexical/react/LexicalHorizontalRulePlugin';
|
||||
import {ListPlugin} from '@lexical/react/LexicalListPlugin';
|
||||
import {PlainTextPlugin} from '@lexical/react/LexicalPlainTextPlugin';
|
||||
import {RichTextPlugin} from '@lexical/react/LexicalRichTextPlugin';
|
||||
import {TabIndentationPlugin} from '@lexical/react/LexicalTabIndentationPlugin';
|
||||
import {TablePlugin} from '@lexical/react/LexicalTablePlugin';
|
||||
import useLexicalEditable from '@lexical/react/useLexicalEditable';
|
||||
import {useEffect, useState,useLayoutEffect} from 'react';
|
||||
import {CAN_USE_DOM} from './shared/src/canUseDOM';
|
||||
|
||||
import {createWebsocketProvider} from './collaboration';
|
||||
import {useSettings} from './context/SettingsContext';
|
||||
import {useSharedHistoryContext} from './context/SharedHistoryContext';
|
||||
import ActionsPlugin from './plugins/ActionsPlugin';
|
||||
import AutocompletePlugin from './plugins/AutocompletePlugin';
|
||||
import AutoEmbedPlugin from './plugins/AutoEmbedPlugin';
|
||||
import AutoLinkPlugin from './plugins/AutoLinkPlugin';
|
||||
import CodeActionMenuPlugin from './plugins/CodeActionMenuPlugin';
|
||||
import CodeHighlightPlugin from './plugins/CodeHighlightPlugin';
|
||||
import CollapsiblePlugin from './plugins/CollapsiblePlugin';
|
||||
import CommentPlugin from './plugins/CommentPlugin';
|
||||
import ComponentPickerPlugin from './plugins/ComponentPickerPlugin';
|
||||
import ContextMenuPlugin from './plugins/ContextMenuPlugin';
|
||||
import DragDropPaste from './plugins/DragDropPastePlugin';
|
||||
import DraggableBlockPlugin from './plugins/DraggableBlockPlugin';
|
||||
import EmojiPickerPlugin from './plugins/EmojiPickerPlugin';
|
||||
import EmojisPlugin from './plugins/EmojisPlugin';
|
||||
import EquationsPlugin from './plugins/EquationsPlugin';
|
||||
import ExcalidrawPlugin from './plugins/ExcalidrawPlugin';
|
||||
import FigmaPlugin from './plugins/FigmaPlugin';
|
||||
import FloatingLinkEditorPlugin from './plugins/FloatingLinkEditorPlugin';
|
||||
import FloatingTextFormatToolbarPlugin from './plugins/FloatingTextFormatToolbarPlugin';
|
||||
import ImagesPlugin from './plugins/ImagesPlugin';
|
||||
import InlineImagePlugin from './plugins/InlineImagePlugin';
|
||||
import KeywordsPlugin from './plugins/KeywordsPlugin';
|
||||
import {LayoutPlugin} from './plugins/LayoutPlugin/LayoutPlugin';
|
||||
import LinkPlugin from './plugins/LinkPlugin';
|
||||
import ListMaxIndentLevelPlugin from './plugins/ListMaxIndentLevelPlugin';
|
||||
import MarkdownShortcutPlugin from './plugins/MarkdownShortcutPlugin';
|
||||
import {MaxLengthPlugin} from './plugins/MaxLengthPlugin';
|
||||
import MentionsPlugin from './plugins/MentionsPlugin';
|
||||
import PageBreakPlugin from './plugins/PageBreakPlugin';
|
||||
import PollPlugin from './plugins/PollPlugin';
|
||||
import SpeechToTextPlugin from './plugins/SpeechToTextPlugin';
|
||||
import TabFocusPlugin from './plugins/TabFocusPlugin';
|
||||
import TableCellActionMenuPlugin from './plugins/TableActionMenuPlugin';
|
||||
import TableCellResizer from './plugins/TableCellResizer';
|
||||
import TableOfContentsPlugin from './plugins/TableOfContentsPlugin';
|
||||
import ToolbarPlugin from './plugins/ToolbarPlugin';
|
||||
import TreeViewPlugin from './plugins/TreeViewPlugin';
|
||||
import TwitterPlugin from './plugins/TwitterPlugin';
|
||||
import YouTubePlugin from './plugins/YouTubePlugin';
|
||||
import ContentEditable from './ui/ContentEditable';
|
||||
import Placeholder from './ui/Placeholder';
|
||||
|
||||
import {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';
|
||||
import GlobalEventsPlugin from "./plugins/GlobalEventsPlugin";
|
||||
|
||||
const skipCollaborationInit =
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-expect-error
|
||||
window.parent != null && window.parent.frames.right === window;
|
||||
|
||||
|
||||
function OnChangePlugin({ onChange }) {
|
||||
const [editor] = useLexicalComposerContext();
|
||||
useEffect(() => {
|
||||
return editor.registerUpdateListener(({editorState}) => {
|
||||
onChange(editorState);
|
||||
});
|
||||
}, [editor, onChange]);
|
||||
}
|
||||
|
||||
export default function Editor(props: { noteId: bigint; noteTitle: string; editData: any; handleLawClick_item2: any; }): JSX.Element {
|
||||
const [editor] = useLexicalComposerContext();
|
||||
|
||||
console.log(props.noteId)
|
||||
|
||||
const {historyState} = useSharedHistoryContext();
|
||||
const {
|
||||
settings: {
|
||||
isCollab,
|
||||
isAutocomplete,
|
||||
isMaxLength,
|
||||
isCharLimit,
|
||||
isCharLimitUtf8,
|
||||
isRichText,
|
||||
showTreeView,
|
||||
showTableOfContents,
|
||||
shouldUseLexicalContextMenu,
|
||||
tableCellMerge,
|
||||
tableCellBackgroundColor,
|
||||
},
|
||||
} = useSettings();
|
||||
const isEditable = useLexicalEditable();
|
||||
const text = isCollab
|
||||
? 'Enter some collaborative rich text...'
|
||||
: isRichText
|
||||
? 'Enter some rich text...'
|
||||
: 'Enter some plain text...';
|
||||
const placeholder = <Placeholder>{text}</Placeholder>;
|
||||
const [floatingAnchorElem, setFloatingAnchorElem] =
|
||||
useState<HTMLDivElement | null>(null);
|
||||
const [isSmallWidthViewport, setIsSmallWidthViewport] =
|
||||
useState<boolean>(false);
|
||||
const [isLinkEditMode, setIsLinkEditMode] = useState<boolean>(false);
|
||||
const [editorState, setEditorState] = useState();
|
||||
const onRef = (_floatingAnchorElem: HTMLDivElement) => {
|
||||
if (_floatingAnchorElem !== null) {
|
||||
setFloatingAnchorElem(_floatingAnchorElem);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
const updateViewPortWidth = () => {
|
||||
const isNextSmallWidthViewport =
|
||||
CAN_USE_DOM && window.matchMedia('(max-width: 1025px)').matches;
|
||||
|
||||
if (isNextSmallWidthViewport !== isSmallWidthViewport) {
|
||||
setIsSmallWidthViewport(isNextSmallWidthViewport);
|
||||
}
|
||||
};
|
||||
updateViewPortWidth();
|
||||
window.addEventListener('resize', updateViewPortWidth);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener('resize', updateViewPortWidth);
|
||||
};
|
||||
}, [isSmallWidthViewport]);
|
||||
|
||||
|
||||
function onChange(editorState) {
|
||||
// Call toJSON on the EditorState object, which produces a serialization safe string
|
||||
const editorStateJSON = editorState.toJSON();
|
||||
|
||||
// However, we still have a JavaScript object, so we need to convert it to an actual string with JSON.stringify
|
||||
setEditorState(JSON.stringify(editorStateJSON));
|
||||
|
||||
}
|
||||
|
||||
console.log(props.noteId)
|
||||
// console.log(props.editData)
|
||||
|
||||
return (
|
||||
<>
|
||||
{isRichText && <ToolbarPlugin setIsLinkEditMode={setIsLinkEditMode} />}
|
||||
<div
|
||||
className={`editor-container ${showTreeView ? 'tree-view' : ''} ${
|
||||
!isRichText ? 'plain-text' : ''
|
||||
}`}>
|
||||
{isMaxLength && <MaxLengthPlugin maxLength={30} />}
|
||||
<DragDropPaste />
|
||||
<AutoFocusPlugin />
|
||||
<ClearEditorPlugin />
|
||||
<ComponentPickerPlugin />
|
||||
<EmojiPickerPlugin />
|
||||
<AutoEmbedPlugin />
|
||||
|
||||
<MentionsPlugin />
|
||||
<EmojisPlugin />
|
||||
<HashtagPlugin />
|
||||
<KeywordsPlugin />
|
||||
<SpeechToTextPlugin />
|
||||
<AutoLinkPlugin />
|
||||
<CommentPlugin
|
||||
providerFactory={isCollab ? createWebsocketProvider : undefined}
|
||||
/>
|
||||
{isRichText ? (
|
||||
<>
|
||||
{isCollab ? (
|
||||
<CollaborationPlugin
|
||||
id="main"
|
||||
providerFactory={createWebsocketProvider}
|
||||
shouldBootstrap={!skipCollaborationInit}
|
||||
/>
|
||||
) : (
|
||||
<HistoryPlugin externalHistoryState={historyState} />
|
||||
)}
|
||||
<RichTextPlugin
|
||||
contentEditable={
|
||||
<div className="editor-scroller">
|
||||
<div className="editor" ref={onRef}>
|
||||
<ContentEditable />
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
placeholder={placeholder}
|
||||
ErrorBoundary={LexicalErrorBoundary}
|
||||
/>
|
||||
<MarkdownShortcutPlugin />
|
||||
<CodeHighlightPlugin />
|
||||
<ListPlugin />
|
||||
<CheckListPlugin />
|
||||
<ListMaxIndentLevelPlugin maxDepth={7} />
|
||||
<TablePlugin
|
||||
hasCellMerge={tableCellMerge}
|
||||
hasCellBackgroundColor={tableCellBackgroundColor}
|
||||
/>
|
||||
<TableCellResizer />
|
||||
<ImagesPlugin />
|
||||
<InlineImagePlugin />
|
||||
<LinkPlugin />
|
||||
<PollPlugin />
|
||||
<TwitterPlugin />
|
||||
<YouTubePlugin />
|
||||
<FigmaPlugin />
|
||||
{!isEditable && <LexicalClickableLinkPlugin />}
|
||||
<HorizontalRulePlugin />
|
||||
<EquationsPlugin />
|
||||
<ExcalidrawPlugin />
|
||||
<TabFocusPlugin />
|
||||
<TabIndentationPlugin />
|
||||
<CollapsiblePlugin />
|
||||
<PageBreakPlugin />
|
||||
<LayoutPlugin />
|
||||
<OnChangePlugin onChange={onChange}/>
|
||||
<GlobalEventsPlugin />
|
||||
{floatingAnchorElem && !isSmallWidthViewport && (
|
||||
<>
|
||||
<DraggableBlockPlugin anchorElem={floatingAnchorElem} />
|
||||
<CodeActionMenuPlugin anchorElem={floatingAnchorElem} />
|
||||
<FloatingLinkEditorPlugin
|
||||
anchorElem={floatingAnchorElem}
|
||||
isLinkEditMode={isLinkEditMode}
|
||||
setIsLinkEditMode={setIsLinkEditMode}
|
||||
/>
|
||||
<TableCellActionMenuPlugin
|
||||
anchorElem={floatingAnchorElem}
|
||||
cellMerge={true}
|
||||
/>
|
||||
<FloatingTextFormatToolbarPlugin
|
||||
anchorElem={floatingAnchorElem}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<PlainTextPlugin
|
||||
contentEditable={<ContentEditable />}
|
||||
placeholder={placeholder}
|
||||
ErrorBoundary={LexicalErrorBoundary}
|
||||
/>
|
||||
<HistoryPlugin externalHistoryState={historyState} />
|
||||
</>
|
||||
)}
|
||||
{(isCharLimit || isCharLimitUtf8) && (
|
||||
<CharacterLimitPlugin
|
||||
charset={isCharLimit ? 'UTF-16' : 'UTF-8'}
|
||||
maxLength={5}
|
||||
/>
|
||||
)}
|
||||
{isAutocomplete && <AutocompletePlugin />}
|
||||
<div>{showTableOfContents && <TableOfContentsPlugin />}</div>
|
||||
{shouldUseLexicalContextMenu && <ContextMenuPlugin />}
|
||||
<ActionsPlugin isRichText={isRichText} noteId={props.noteId} noteTitle={props.noteTitle} editData ={props.editData} handleLawClick_item3={props.handleLawClick_item2}/>
|
||||
</div>
|
||||
{showTreeView && <TreeViewPlugin />}
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,210 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
*/
|
||||
import "./index.css";
|
||||
import {$createLinkNode} from '@lexical/link';
|
||||
import {$createListItemNode, $createListNode} from '@lexical/list';
|
||||
import {LexicalComposer} from '@lexical/react/LexicalComposer';
|
||||
import {$createHeadingNode, $createQuoteNode} from '@lexical/rich-text';
|
||||
import {$createParagraphNode, $createTextNode, $getRoot} from 'lexical';
|
||||
|
||||
import {isDevPlayground} from './appSettings';
|
||||
import {SettingsContext, useSettings} from './context/SettingsContext';
|
||||
import {SharedAutocompleteContext} from './context/SharedAutocompleteContext';
|
||||
import {SharedHistoryContext} from './context/SharedHistoryContext';
|
||||
import Editor from './Editor';
|
||||
import logo from './images/logo.svg';
|
||||
import PlaygroundNodes from './nodes/PlaygroundNodes';
|
||||
import DocsPlugin from './plugins/DocsPlugin';
|
||||
import PasteLogPlugin from './plugins/PasteLogPlugin';
|
||||
import {TableContext} from './plugins/TablePlugin';
|
||||
import TestRecorderPlugin from './plugins/TestRecorderPlugin';
|
||||
import TypingPerfPlugin from './plugins/TypingPerfPlugin';
|
||||
import Settings from './Settings';
|
||||
import PlaygroundEditorTheme from './themes/PlaygroundEditorTheme';
|
||||
|
||||
console.warn(
|
||||
'If you are profiling the playground app, please ensure you turn off the debug view. You can disable it by pressing on the settings control in the bottom-left of your screen and toggling the debug view setting.',
|
||||
);
|
||||
|
||||
function prepopulatedRichText() {
|
||||
const root = $getRoot();
|
||||
if (root.getFirstChild() === null) {
|
||||
const heading = $createHeadingNode('h1');
|
||||
heading.append($createTextNode('Welcome to the playground'));
|
||||
root.append(heading);
|
||||
const quote = $createQuoteNode();
|
||||
quote.append(
|
||||
$createTextNode(
|
||||
`In case you were wondering what the black box at the bottom is – it's the debug view, showing the current state of the editor. ` +
|
||||
`You can disable it by pressing on the settings control in the bottom-left of your screen and toggling the debug view setting.`,
|
||||
),
|
||||
);
|
||||
root.append(quote);
|
||||
const paragraph = $createParagraphNode();
|
||||
paragraph.append(
|
||||
$createTextNode('The playground is a demo environment built with '),
|
||||
$createTextNode('@lexical/react').toggleFormat('code'),
|
||||
$createTextNode('.'),
|
||||
$createTextNode(' Try typing in '),
|
||||
$createTextNode('some text').toggleFormat('bold'),
|
||||
$createTextNode(' with '),
|
||||
$createTextNode('different').toggleFormat('italic'),
|
||||
$createTextNode(' formats.'),
|
||||
);
|
||||
root.append(paragraph);
|
||||
const paragraph2 = $createParagraphNode();
|
||||
paragraph2.append(
|
||||
$createTextNode(
|
||||
'Make sure to check out the various plugins in the toolbar. You can also use #hashtags or @-mentions too!',
|
||||
),
|
||||
);
|
||||
root.append(paragraph2);
|
||||
const paragraph3 = $createParagraphNode();
|
||||
paragraph3.append(
|
||||
$createTextNode(`If you'd like to find out more about Lexical, you can:`),
|
||||
);
|
||||
root.append(paragraph3);
|
||||
const list = $createListNode('bullet');
|
||||
list.append(
|
||||
$createListItemNode().append(
|
||||
$createTextNode(`Visit the `),
|
||||
$createLinkNode('https://lexical.dev/').append(
|
||||
$createTextNode('Lexical website'),
|
||||
),
|
||||
$createTextNode(` for documentation and more information.`),
|
||||
),
|
||||
$createListItemNode().append(
|
||||
$createTextNode(`Check out the code on our `),
|
||||
$createLinkNode('https://github.com/facebook/lexical').append(
|
||||
$createTextNode('GitHub repository'),
|
||||
),
|
||||
$createTextNode(`.`),
|
||||
),
|
||||
$createListItemNode().append(
|
||||
$createTextNode(`Playground code can be found `),
|
||||
$createLinkNode(
|
||||
'https://github.com/facebook/lexical/tree/main/packages/lexical-playground',
|
||||
).append($createTextNode('here')),
|
||||
$createTextNode(`.`),
|
||||
),
|
||||
$createListItemNode().append(
|
||||
$createTextNode(`Join our `),
|
||||
$createLinkNode('https://discord.com/invite/KmG4wQnnD9').append(
|
||||
$createTextNode('Discord Server'),
|
||||
),
|
||||
$createTextNode(` and chat with the team.`),
|
||||
),
|
||||
);
|
||||
root.append(list);
|
||||
const paragraph4 = $createParagraphNode();
|
||||
paragraph4.append(
|
||||
$createTextNode(
|
||||
`Lastly, we're constantly adding cool new features to this playground. So make sure you check back here when you next get a chance :).`,
|
||||
),
|
||||
);
|
||||
root.append(paragraph4);
|
||||
}
|
||||
}
|
||||
|
||||
function LexicalApp(props: { noteId: bigint; editData: object | null; noteTitle: string; handleLawClick_item1: any; }): JSX.Element {
|
||||
const {
|
||||
settings: {isCollab, emptyEditor, measureTypingPerf},
|
||||
} = useSettings();
|
||||
|
||||
console.log(props.noteId)
|
||||
// console.log(props.editData)
|
||||
console.log(props.editData!==null)
|
||||
console.log(prepopulatedRichText)
|
||||
|
||||
const initialConfig = {
|
||||
// editorState: isCollab
|
||||
// ? null
|
||||
// : emptyEditor
|
||||
// ? undefined
|
||||
// : prepopulatedRichText,
|
||||
editorState: props.editData!==null?props.editData:prepopulatedRichText,
|
||||
namespace: 'Playground',
|
||||
nodes: [...PlaygroundNodes],
|
||||
onError: (error: Error) => {
|
||||
throw error;
|
||||
},
|
||||
theme: PlaygroundEditorTheme,
|
||||
};
|
||||
|
||||
return (
|
||||
<LexicalComposer initialConfig={initialConfig}>
|
||||
<SharedHistoryContext>
|
||||
<TableContext>
|
||||
<SharedAutocompleteContext>
|
||||
{/*<header>*/}
|
||||
{/* <a href="https://lexical.dev" target="_blank" rel="noreferrer">*/}
|
||||
{/* <img src={logo} alt="Lexical Logo" />*/}
|
||||
{/* </a>*/}
|
||||
{/*</header>*/}
|
||||
<div className="editor-shell">
|
||||
<Editor noteId={props.noteId} noteTitle={props.noteTitle} editData ={props.editData} handleLawClick_item2={props.handleLawClick_item1}/>
|
||||
</div>
|
||||
{/*<Settings />*/}
|
||||
{/*{isDevPlayground ? <DocsPlugin /> : null}*/}
|
||||
{/*{isDevPlayground ? <PasteLogPlugin /> : null}*/}
|
||||
{/*{isDevPlayground ? <TestRecorderPlugin /> : null}*/}
|
||||
|
||||
{measureTypingPerf ? <TypingPerfPlugin /> : null}
|
||||
</SharedAutocompleteContext>
|
||||
</TableContext>
|
||||
</SharedHistoryContext>
|
||||
</LexicalComposer>
|
||||
);
|
||||
}
|
||||
|
||||
export default function PlaygroundApp(props: { noteId: bigint; noteTitle: string; editData: object; handleLawClick: any; }): JSX.Element {
|
||||
|
||||
return (
|
||||
// <Editor />
|
||||
|
||||
<LexicalApp noteId={props.noteId} noteTitle={props.noteTitle} editData ={props.editData} handleLawClick_item1={props.handleLawClick}/>
|
||||
//
|
||||
// <SettingsContext>
|
||||
// <LexicalApp />
|
||||
// <a
|
||||
// href="https://github.com/facebook/lexical/tree/main/packages/lexical-playground"
|
||||
// className="github-corner"
|
||||
// aria-label="View source on GitHub">
|
||||
// <svg
|
||||
// width="80"
|
||||
// height="80"
|
||||
// viewBox="0 0 250 250"
|
||||
// style={{
|
||||
// border: '0',
|
||||
// color: '#eee',
|
||||
// fill: '#222',
|
||||
// left: '0',
|
||||
// position: 'absolute',
|
||||
// top: '0',
|
||||
// transform: 'scale(-1,1)',
|
||||
// }}
|
||||
// aria-hidden="true">
|
||||
// <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z" />
|
||||
// <path
|
||||
// d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
|
||||
// fill="currentColor"
|
||||
// style={{
|
||||
// transformOrigin: '130px 106px',
|
||||
// }}
|
||||
// className="octo-arm"
|
||||
// />
|
||||
// <path
|
||||
// d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
|
||||
// fill="currentColor"
|
||||
// className="octo-body"
|
||||
// />
|
||||
// </svg>
|
||||
// </a>
|
||||
// </SettingsContext>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
import * as React from 'react';
|
||||
import {useMemo, useState} from 'react';
|
||||
|
||||
import {isDevPlayground} from './appSettings';
|
||||
import {useSettings} from './context/SettingsContext';
|
||||
import Switch from './ui/Switch';
|
||||
|
||||
export default function Settings(): JSX.Element {
|
||||
const windowLocation = window.location;
|
||||
const {
|
||||
setOption,
|
||||
settings: {
|
||||
measureTypingPerf,
|
||||
isCollab,
|
||||
isRichText,
|
||||
isMaxLength,
|
||||
isCharLimit,
|
||||
isCharLimitUtf8,
|
||||
isAutocomplete,
|
||||
showTreeView,
|
||||
showNestedEditorTreeView,
|
||||
disableBeforeInput,
|
||||
showTableOfContents,
|
||||
shouldUseLexicalContextMenu,
|
||||
},
|
||||
} = useSettings();
|
||||
const [showSettings, setShowSettings] = useState(false);
|
||||
const [isSplitScreen, search] = useMemo(() => {
|
||||
const parentWindow = window.parent;
|
||||
const _search = windowLocation.search;
|
||||
const _isSplitScreen =
|
||||
parentWindow && parentWindow.location.pathname === '/split/';
|
||||
return [_isSplitScreen, _search];
|
||||
}, [windowLocation]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<button
|
||||
id="options-button"
|
||||
className={`editor-dev-button ${showSettings ? 'active' : ''}`}
|
||||
onClick={() => setShowSettings(!showSettings)}
|
||||
/>
|
||||
{showSettings ? (
|
||||
<div className="switches">
|
||||
{isRichText && isDevPlayground && (
|
||||
<Switch
|
||||
onClick={() => {
|
||||
setOption('isCollab', !isCollab);
|
||||
window.location.reload();
|
||||
}}
|
||||
checked={isCollab}
|
||||
text="Collaboration"
|
||||
/>
|
||||
)}
|
||||
{isDevPlayground && (
|
||||
<Switch
|
||||
onClick={() => {
|
||||
if (isSplitScreen) {
|
||||
window.parent.location.href = `/${search}`;
|
||||
} else {
|
||||
window.location.href = `/split/${search}`;
|
||||
}
|
||||
}}
|
||||
checked={isSplitScreen}
|
||||
text="Split Screen"
|
||||
/>
|
||||
)}
|
||||
<Switch
|
||||
onClick={() => setOption('measureTypingPerf', !measureTypingPerf)}
|
||||
checked={measureTypingPerf}
|
||||
text="Measure Perf"
|
||||
/>
|
||||
<Switch
|
||||
onClick={() => setOption('showTreeView', !showTreeView)}
|
||||
checked={showTreeView}
|
||||
text="Debug View"
|
||||
/>
|
||||
<Switch
|
||||
onClick={() =>
|
||||
setOption('showNestedEditorTreeView', !showNestedEditorTreeView)
|
||||
}
|
||||
checked={showNestedEditorTreeView}
|
||||
text="Nested Editors Debug View"
|
||||
/>
|
||||
<Switch
|
||||
onClick={() => {
|
||||
setOption('isRichText', !isRichText);
|
||||
setOption('isCollab', false);
|
||||
}}
|
||||
checked={isRichText}
|
||||
text="Rich Text"
|
||||
/>
|
||||
<Switch
|
||||
onClick={() => setOption('isCharLimit', !isCharLimit)}
|
||||
checked={isCharLimit}
|
||||
text="Char Limit"
|
||||
/>
|
||||
<Switch
|
||||
onClick={() => setOption('isCharLimitUtf8', !isCharLimitUtf8)}
|
||||
checked={isCharLimitUtf8}
|
||||
text="Char Limit (UTF-8)"
|
||||
/>
|
||||
<Switch
|
||||
onClick={() => setOption('isMaxLength', !isMaxLength)}
|
||||
checked={isMaxLength}
|
||||
text="Max Length"
|
||||
/>
|
||||
<Switch
|
||||
onClick={() => setOption('isAutocomplete', !isAutocomplete)}
|
||||
checked={isAutocomplete}
|
||||
text="Autocomplete"
|
||||
/>
|
||||
<Switch
|
||||
onClick={() => {
|
||||
setOption('disableBeforeInput', !disableBeforeInput);
|
||||
setTimeout(() => window.location.reload(), 500);
|
||||
}}
|
||||
checked={disableBeforeInput}
|
||||
text="Legacy Events"
|
||||
/>
|
||||
<Switch
|
||||
onClick={() => {
|
||||
setOption('showTableOfContents', !showTableOfContents);
|
||||
}}
|
||||
checked={showTableOfContents}
|
||||
text="Table Of Contents"
|
||||
/>
|
||||
<Switch
|
||||
onClick={() => {
|
||||
setOption(
|
||||
'shouldUseLexicalContextMenu',
|
||||
!shouldUseLexicalContextMenu,
|
||||
);
|
||||
}}
|
||||
checked={shouldUseLexicalContextMenu}
|
||||
text="Use Lexical Context Menu"
|
||||
/>
|
||||
</div>
|
||||
) : null}
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
const hostName = window.location.hostname;
|
||||
export const isDevPlayground: boolean =
|
||||
hostName !== 'playground.lexical.dev' &&
|
||||
hostName !== 'lexical-playground.vercel.app';
|
||||
|
||||
export const DEFAULT_SETTINGS = {
|
||||
disableBeforeInput: false,
|
||||
emptyEditor: isDevPlayground,
|
||||
isAutocomplete: false,
|
||||
isCharLimit: false,
|
||||
isCharLimitUtf8: false,
|
||||
isCollab: false,
|
||||
isMaxLength: false,
|
||||
isRichText: true,
|
||||
measureTypingPerf: false,
|
||||
shouldUseLexicalContextMenu: false,
|
||||
showNestedEditorTreeView: false,
|
||||
showTableOfContents: true, //目录显示
|
||||
showTreeView: true,
|
||||
tableCellBackgroundColor: true,
|
||||
tableCellMerge: true,
|
||||
};
|
||||
|
||||
export type SettingName = keyof typeof DEFAULT_SETTINGS;
|
||||
|
||||
export type Settings = typeof DEFAULT_SETTINGS;
|
||||
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
import {Provider} from '@lexical/yjs';
|
||||
import {WebsocketProvider} from 'y-websocket';
|
||||
import {Doc} from 'yjs';
|
||||
|
||||
const url = new URL(window.location.href);
|
||||
const params = new URLSearchParams(url.search);
|
||||
const WEBSOCKET_ENDPOINT =
|
||||
params.get('collabEndpoint') || 'ws://localhost:1234';
|
||||
const WEBSOCKET_SLUG = 'playground';
|
||||
const WEBSOCKET_ID = params.get('collabId') || '0';
|
||||
|
||||
// parent dom -> child doc
|
||||
export function createWebsocketProvider(
|
||||
id: string,
|
||||
yjsDocMap: Map<string, Doc>,
|
||||
): Provider {
|
||||
let doc = yjsDocMap.get(id);
|
||||
|
||||
if (doc === undefined) {
|
||||
doc = new Doc();
|
||||
yjsDocMap.set(id, doc);
|
||||
} else {
|
||||
doc.load();
|
||||
}
|
||||
|
||||
// @ts-ignore
|
||||
return new WebsocketProvider(
|
||||
WEBSOCKET_ENDPOINT,
|
||||
WEBSOCKET_SLUG + '/' + WEBSOCKET_ID + '/' + id,
|
||||
doc,
|
||||
{
|
||||
connect: false,
|
||||
},
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,451 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
import type {LexicalEditor} from 'lexical';
|
||||
|
||||
import {Provider, TOGGLE_CONNECT_COMMAND} from '@lexical/yjs';
|
||||
import {COMMAND_PRIORITY_LOW} from 'lexical';
|
||||
import {useEffect, useState} from 'react';
|
||||
import {
|
||||
Array as YArray,
|
||||
Map as YMap,
|
||||
Transaction,
|
||||
YArrayEvent,
|
||||
YEvent,
|
||||
} from 'yjs';
|
||||
|
||||
export type Comment = {
|
||||
author: string;
|
||||
content: string;
|
||||
deleted: boolean;
|
||||
id: string;
|
||||
timeStamp: number;
|
||||
type: 'comment';
|
||||
};
|
||||
|
||||
export type Thread = {
|
||||
comments: Array<Comment>;
|
||||
id: string;
|
||||
quote: string;
|
||||
type: 'thread';
|
||||
};
|
||||
|
||||
export type Comments = Array<Thread | Comment>;
|
||||
|
||||
function createUID(): string {
|
||||
return Math.random()
|
||||
.toString(36)
|
||||
.replace(/[^a-z]+/g, '')
|
||||
.substr(0, 5);
|
||||
}
|
||||
|
||||
export function createComment(
|
||||
content: string,
|
||||
author: string,
|
||||
id?: string,
|
||||
timeStamp?: number,
|
||||
deleted?: boolean,
|
||||
): Comment {
|
||||
return {
|
||||
author,
|
||||
content,
|
||||
deleted: deleted === undefined ? false : deleted,
|
||||
id: id === undefined ? createUID() : id,
|
||||
timeStamp: timeStamp === undefined ? performance.now() : timeStamp,
|
||||
type: 'comment',
|
||||
};
|
||||
}
|
||||
|
||||
export function createThread(
|
||||
quote: string,
|
||||
comments: Array<Comment>,
|
||||
id?: string,
|
||||
): Thread {
|
||||
return {
|
||||
comments,
|
||||
id: id === undefined ? createUID() : id,
|
||||
quote,
|
||||
type: 'thread',
|
||||
};
|
||||
}
|
||||
|
||||
function cloneThread(thread: Thread): Thread {
|
||||
return {
|
||||
comments: Array.from(thread.comments),
|
||||
id: thread.id,
|
||||
quote: thread.quote,
|
||||
type: 'thread',
|
||||
};
|
||||
}
|
||||
|
||||
function markDeleted(comment: Comment): Comment {
|
||||
return {
|
||||
author: comment.author,
|
||||
content: '[Deleted Comment]',
|
||||
deleted: true,
|
||||
id: comment.id,
|
||||
timeStamp: comment.timeStamp,
|
||||
type: 'comment',
|
||||
};
|
||||
}
|
||||
|
||||
function triggerOnChange(commentStore: CommentStore): void {
|
||||
const listeners = commentStore._changeListeners;
|
||||
for (const listener of listeners) {
|
||||
listener();
|
||||
}
|
||||
}
|
||||
|
||||
export class CommentStore {
|
||||
_editor: LexicalEditor;
|
||||
_comments: Comments;
|
||||
_changeListeners: Set<() => void>;
|
||||
_collabProvider: null | Provider;
|
||||
|
||||
constructor(editor: LexicalEditor) {
|
||||
this._comments = [];
|
||||
this._editor = editor;
|
||||
this._collabProvider = null;
|
||||
this._changeListeners = new Set();
|
||||
}
|
||||
|
||||
isCollaborative(): boolean {
|
||||
return this._collabProvider !== null;
|
||||
}
|
||||
|
||||
getComments(): Comments {
|
||||
return this._comments;
|
||||
}
|
||||
|
||||
addComment(
|
||||
commentOrThread: Comment | Thread,
|
||||
thread?: Thread,
|
||||
offset?: number,
|
||||
): void {
|
||||
const nextComments = Array.from(this._comments);
|
||||
// The YJS types explicitly use `any` as well.
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const sharedCommentsArray: YArray<any> | null = this._getCollabComments();
|
||||
|
||||
if (thread !== undefined && commentOrThread.type === 'comment') {
|
||||
for (let i = 0; i < nextComments.length; i++) {
|
||||
const comment = nextComments[i];
|
||||
if (comment.type === 'thread' && comment.id === thread.id) {
|
||||
const newThread = cloneThread(comment);
|
||||
nextComments.splice(i, 1, newThread);
|
||||
const insertOffset =
|
||||
offset !== undefined ? offset : newThread.comments.length;
|
||||
if (this.isCollaborative() && sharedCommentsArray !== null) {
|
||||
const parentSharedArray = sharedCommentsArray
|
||||
.get(i)
|
||||
.get('comments');
|
||||
this._withRemoteTransaction(() => {
|
||||
const sharedMap = this._createCollabSharedMap(commentOrThread);
|
||||
parentSharedArray.insert(insertOffset, [sharedMap]);
|
||||
});
|
||||
}
|
||||
newThread.comments.splice(insertOffset, 0, commentOrThread);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const insertOffset = offset !== undefined ? offset : nextComments.length;
|
||||
if (this.isCollaborative() && sharedCommentsArray !== null) {
|
||||
this._withRemoteTransaction(() => {
|
||||
const sharedMap = this._createCollabSharedMap(commentOrThread);
|
||||
sharedCommentsArray.insert(insertOffset, [sharedMap]);
|
||||
});
|
||||
}
|
||||
nextComments.splice(insertOffset, 0, commentOrThread);
|
||||
}
|
||||
this._comments = nextComments;
|
||||
triggerOnChange(this);
|
||||
}
|
||||
|
||||
deleteCommentOrThread(
|
||||
commentOrThread: Comment | Thread,
|
||||
thread?: Thread,
|
||||
): {markedComment: Comment; index: number} | null {
|
||||
const nextComments = Array.from(this._comments);
|
||||
// The YJS types explicitly use `any` as well.
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const sharedCommentsArray: YArray<any> | null = this._getCollabComments();
|
||||
let commentIndex: number | null = null;
|
||||
|
||||
if (thread !== undefined) {
|
||||
for (let i = 0; i < nextComments.length; i++) {
|
||||
const nextComment = nextComments[i];
|
||||
if (nextComment.type === 'thread' && nextComment.id === thread.id) {
|
||||
const newThread = cloneThread(nextComment);
|
||||
nextComments.splice(i, 1, newThread);
|
||||
const threadComments = newThread.comments;
|
||||
commentIndex = threadComments.indexOf(commentOrThread as Comment);
|
||||
if (this.isCollaborative() && sharedCommentsArray !== null) {
|
||||
const parentSharedArray = sharedCommentsArray
|
||||
.get(i)
|
||||
.get('comments');
|
||||
this._withRemoteTransaction(() => {
|
||||
parentSharedArray.delete(commentIndex);
|
||||
});
|
||||
}
|
||||
threadComments.splice(commentIndex, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
commentIndex = nextComments.indexOf(commentOrThread);
|
||||
if (this.isCollaborative() && sharedCommentsArray !== null) {
|
||||
this._withRemoteTransaction(() => {
|
||||
sharedCommentsArray.delete(commentIndex as number);
|
||||
});
|
||||
}
|
||||
nextComments.splice(commentIndex, 1);
|
||||
}
|
||||
this._comments = nextComments;
|
||||
triggerOnChange(this);
|
||||
|
||||
if (commentOrThread.type === 'comment') {
|
||||
return {
|
||||
index: commentIndex as number,
|
||||
markedComment: markDeleted(commentOrThread as Comment),
|
||||
};
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
registerOnChange(onChange: () => void): () => void {
|
||||
const changeListeners = this._changeListeners;
|
||||
changeListeners.add(onChange);
|
||||
return () => {
|
||||
changeListeners.delete(onChange);
|
||||
};
|
||||
}
|
||||
|
||||
_withRemoteTransaction(fn: () => void): void {
|
||||
const provider = this._collabProvider;
|
||||
if (provider !== null) {
|
||||
// @ts-ignore doc does exist
|
||||
const doc = provider.doc;
|
||||
doc.transact(fn, this);
|
||||
}
|
||||
}
|
||||
|
||||
_withLocalTransaction(fn: () => void): void {
|
||||
const collabProvider = this._collabProvider;
|
||||
try {
|
||||
this._collabProvider = null;
|
||||
fn();
|
||||
} finally {
|
||||
this._collabProvider = collabProvider;
|
||||
}
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
_getCollabComments(): null | YArray<any> {
|
||||
const provider = this._collabProvider;
|
||||
if (provider !== null) {
|
||||
// @ts-ignore doc does exist
|
||||
const doc = provider.doc;
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
return doc.get('comments', YArray) as YArray<any>;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
_createCollabSharedMap(commentOrThread: Comment | Thread): YMap<any> {
|
||||
const sharedMap = new YMap();
|
||||
const type = commentOrThread.type;
|
||||
const id = commentOrThread.id;
|
||||
sharedMap.set('type', type);
|
||||
sharedMap.set('id', id);
|
||||
if (type === 'comment') {
|
||||
sharedMap.set('author', commentOrThread.author);
|
||||
sharedMap.set('content', commentOrThread.content);
|
||||
sharedMap.set('deleted', commentOrThread.deleted);
|
||||
sharedMap.set('timeStamp', commentOrThread.timeStamp);
|
||||
} else {
|
||||
sharedMap.set('quote', commentOrThread.quote);
|
||||
const commentsArray = new YArray();
|
||||
commentOrThread.comments.forEach((comment, i) => {
|
||||
const sharedChildComment = this._createCollabSharedMap(comment);
|
||||
commentsArray.insert(i, [sharedChildComment]);
|
||||
});
|
||||
sharedMap.set('comments', commentsArray);
|
||||
}
|
||||
return sharedMap;
|
||||
}
|
||||
|
||||
registerCollaboration(provider: Provider): () => void {
|
||||
this._collabProvider = provider;
|
||||
const sharedCommentsArray = this._getCollabComments();
|
||||
|
||||
const connect = () => {
|
||||
provider.connect();
|
||||
};
|
||||
|
||||
const disconnect = () => {
|
||||
try {
|
||||
provider.disconnect();
|
||||
} catch (e) {
|
||||
// Do nothing
|
||||
}
|
||||
};
|
||||
|
||||
const unsubscribe = this._editor.registerCommand(
|
||||
TOGGLE_CONNECT_COMMAND,
|
||||
(payload) => {
|
||||
if (connect !== undefined && disconnect !== undefined) {
|
||||
const shouldConnect = payload;
|
||||
|
||||
if (shouldConnect) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('Comments connected!');
|
||||
connect();
|
||||
} else {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('Comments disconnected!');
|
||||
disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
COMMAND_PRIORITY_LOW,
|
||||
);
|
||||
|
||||
const onSharedCommentChanges = (
|
||||
// The YJS types explicitly use `any` as well.
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
events: Array<YEvent<any>>,
|
||||
transaction: Transaction,
|
||||
) => {
|
||||
if (transaction.origin !== this) {
|
||||
for (let i = 0; i < events.length; i++) {
|
||||
const event = events[i];
|
||||
|
||||
if (event instanceof YArrayEvent) {
|
||||
const target = event.target;
|
||||
const deltas = event.delta;
|
||||
let offset = 0;
|
||||
|
||||
for (let s = 0; s < deltas.length; s++) {
|
||||
const delta = deltas[s];
|
||||
const insert = delta.insert;
|
||||
const retain = delta.retain;
|
||||
const del = delta.delete;
|
||||
const parent = target.parent;
|
||||
const parentThread =
|
||||
target === sharedCommentsArray
|
||||
? undefined
|
||||
: parent instanceof YMap &&
|
||||
(this._comments.find((t) => t.id === parent.get('id')) as
|
||||
| Thread
|
||||
| undefined);
|
||||
|
||||
if (Array.isArray(insert)) {
|
||||
insert
|
||||
.slice()
|
||||
.reverse()
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
.forEach((map: YMap<any>) => {
|
||||
const id = map.get('id');
|
||||
const type = map.get('type');
|
||||
|
||||
const commentOrThread =
|
||||
type === 'thread'
|
||||
? createThread(
|
||||
map.get('quote'),
|
||||
map
|
||||
.get('comments')
|
||||
.toArray()
|
||||
.map(
|
||||
(
|
||||
innerComment: Map<
|
||||
string,
|
||||
string | number | boolean
|
||||
>,
|
||||
) =>
|
||||
createComment(
|
||||
innerComment.get('content') as string,
|
||||
innerComment.get('author') as string,
|
||||
innerComment.get('id') as string,
|
||||
innerComment.get('timeStamp') as number,
|
||||
innerComment.get('deleted') as boolean,
|
||||
),
|
||||
),
|
||||
id,
|
||||
)
|
||||
: createComment(
|
||||
map.get('content'),
|
||||
map.get('author'),
|
||||
id,
|
||||
map.get('timeStamp'),
|
||||
map.get('deleted'),
|
||||
);
|
||||
this._withLocalTransaction(() => {
|
||||
this.addComment(
|
||||
commentOrThread,
|
||||
parentThread as Thread,
|
||||
offset,
|
||||
);
|
||||
});
|
||||
});
|
||||
} else if (typeof retain === 'number') {
|
||||
offset += retain;
|
||||
} else if (typeof del === 'number') {
|
||||
for (let d = 0; d < del; d++) {
|
||||
const commentOrThread =
|
||||
parentThread === undefined || parentThread === false
|
||||
? this._comments[offset]
|
||||
: parentThread.comments[offset];
|
||||
this._withLocalTransaction(() => {
|
||||
this.deleteCommentOrThread(
|
||||
commentOrThread,
|
||||
parentThread as Thread,
|
||||
);
|
||||
});
|
||||
offset++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (sharedCommentsArray === null) {
|
||||
return () => null;
|
||||
}
|
||||
|
||||
sharedCommentsArray.observeDeep(onSharedCommentChanges);
|
||||
|
||||
connect();
|
||||
|
||||
return () => {
|
||||
sharedCommentsArray.unobserveDeep(onSharedCommentChanges);
|
||||
unsubscribe();
|
||||
this._collabProvider = null;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export function useCommentStore(commentStore: CommentStore): Comments {
|
||||
const [comments, setComments] = useState<Comments>(
|
||||
commentStore.getComments(),
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
return commentStore.registerOnChange(() => {
|
||||
setComments(commentStore.getComments());
|
||||
});
|
||||
}, [commentStore]);
|
||||
|
||||
return comments;
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
import type {SettingName} from '../appSettings';
|
||||
|
||||
import * as React from 'react';
|
||||
import {
|
||||
createContext,
|
||||
ReactNode,
|
||||
useCallback,
|
||||
useContext,
|
||||
useMemo,
|
||||
useState,
|
||||
} from 'react';
|
||||
|
||||
import {DEFAULT_SETTINGS} from '../appSettings';
|
||||
|
||||
type SettingsContextShape = {
|
||||
setOption: (name: SettingName, value: boolean) => void;
|
||||
settings: Record<SettingName, boolean>;
|
||||
};
|
||||
|
||||
const Context: React.Context<SettingsContextShape> = createContext({
|
||||
setOption: (name: SettingName, value: boolean) => {
|
||||
return;
|
||||
},
|
||||
settings: DEFAULT_SETTINGS,
|
||||
});
|
||||
|
||||
export const SettingsContext = ({
|
||||
children,
|
||||
}: {
|
||||
children: ReactNode;
|
||||
}): JSX.Element => {
|
||||
const [settings, setSettings] = useState(DEFAULT_SETTINGS);
|
||||
|
||||
const setOption = useCallback((setting: SettingName, value: boolean) => {
|
||||
setSettings((options) => ({
|
||||
...options,
|
||||
[setting as string]: value,
|
||||
}));
|
||||
if (DEFAULT_SETTINGS[setting] === value) {
|
||||
setURLParam(setting, null);
|
||||
} else {
|
||||
setURLParam(setting, value);
|
||||
}
|
||||
}, []);
|
||||
|
||||
const contextValue = useMemo(() => {
|
||||
return {setOption, settings};
|
||||
}, [setOption, settings]);
|
||||
|
||||
return <Context.Provider value={contextValue}>{children}</Context.Provider>;
|
||||
};
|
||||
|
||||
export const useSettings = (): SettingsContextShape => {
|
||||
return useContext(Context);
|
||||
};
|
||||
|
||||
function setURLParam(param: SettingName, value: null | boolean) {
|
||||
const url = new URL(window.location.href);
|
||||
const params = new URLSearchParams(url.search);
|
||||
if (value !== null) {
|
||||
if (params.has(param)) {
|
||||
params.set(param, String(value));
|
||||
} else {
|
||||
params.append(param, String(value));
|
||||
}
|
||||
} else {
|
||||
if (params.has(param)) {
|
||||
params.delete(param);
|
||||
}
|
||||
}
|
||||
url.search = params.toString();
|
||||
window.history.pushState(null, '', url.toString());
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
import * as React from 'react';
|
||||
import {
|
||||
createContext,
|
||||
ReactNode,
|
||||
useContext,
|
||||
useEffect,
|
||||
useMemo,
|
||||
useState,
|
||||
} from 'react';
|
||||
|
||||
type Suggestion = null | string;
|
||||
type CallbackFn = (newSuggestion: Suggestion) => void;
|
||||
type SubscribeFn = (callbackFn: CallbackFn) => () => void;
|
||||
type PublishFn = (newSuggestion: Suggestion) => void;
|
||||
type ContextShape = [SubscribeFn, PublishFn];
|
||||
type HookShape = [suggestion: Suggestion, setSuggestion: PublishFn];
|
||||
|
||||
const Context: React.Context<ContextShape> = createContext([
|
||||
(_cb) => () => {
|
||||
return;
|
||||
},
|
||||
(_newSuggestion: Suggestion) => {
|
||||
return;
|
||||
},
|
||||
]);
|
||||
|
||||
export const SharedAutocompleteContext = ({
|
||||
children,
|
||||
}: {
|
||||
children: ReactNode;
|
||||
}): JSX.Element => {
|
||||
const context: ContextShape = useMemo(() => {
|
||||
let suggestion: Suggestion | null = null;
|
||||
const listeners: Set<CallbackFn> = new Set();
|
||||
return [
|
||||
(cb: (newSuggestion: Suggestion) => void) => {
|
||||
cb(suggestion);
|
||||
listeners.add(cb);
|
||||
return () => {
|
||||
listeners.delete(cb);
|
||||
};
|
||||
},
|
||||
(newSuggestion: Suggestion) => {
|
||||
suggestion = newSuggestion;
|
||||
for (const listener of listeners) {
|
||||
listener(newSuggestion);
|
||||
}
|
||||
},
|
||||
];
|
||||
}, []);
|
||||
return <Context.Provider value={context}>{children}</Context.Provider>;
|
||||
};
|
||||
|
||||
export const useSharedAutocompleteContext = (): HookShape => {
|
||||
const [subscribe, publish]: ContextShape = useContext(Context);
|
||||
const [suggestion, setSuggestion] = useState<Suggestion>(null);
|
||||
useEffect(() => {
|
||||
return subscribe((newSuggestion: Suggestion) => {
|
||||
setSuggestion(newSuggestion);
|
||||
});
|
||||
}, [subscribe]);
|
||||
return [suggestion, publish];
|
||||
};
|
||||
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
import type {HistoryState} from '@lexical/react/LexicalHistoryPlugin';
|
||||
|
||||
import {createEmptyHistoryState} from '@lexical/react/LexicalHistoryPlugin';
|
||||
import * as React from 'react';
|
||||
import {createContext, ReactNode, useContext, useMemo} from 'react';
|
||||
|
||||
type ContextShape = {
|
||||
historyState?: HistoryState;
|
||||
};
|
||||
|
||||
const Context: React.Context<ContextShape> = createContext({});
|
||||
|
||||
export const SharedHistoryContext = ({
|
||||
children,
|
||||
}: {
|
||||
children: ReactNode;
|
||||
}): JSX.Element => {
|
||||
const historyContext = useMemo(
|
||||
() => ({historyState: createEmptyHistoryState()}),
|
||||
[],
|
||||
);
|
||||
return <Context.Provider value={historyContext}>{children}</Context.Provider>;
|
||||
};
|
||||
|
||||
export const useSharedHistoryContext = (): ContextShape => {
|
||||
return useContext(Context);
|
||||
};
|
||||
@@ -0,0 +1,60 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
import {useCallback, useMemo, useState} from 'react';
|
||||
import * as React from 'react';
|
||||
|
||||
import Modal from '../ui/Modal';
|
||||
|
||||
export default function useModal(): [
|
||||
JSX.Element | null,
|
||||
(title: string, showModal: (onClose: () => void) => JSX.Element) => void,
|
||||
] {
|
||||
const [modalContent, setModalContent] = useState<null | {
|
||||
closeOnClickOutside: boolean;
|
||||
content: JSX.Element;
|
||||
title: string;
|
||||
}>(null);
|
||||
|
||||
const onClose = useCallback(() => {
|
||||
setModalContent(null);
|
||||
}, []);
|
||||
|
||||
const modal = useMemo(() => {
|
||||
if (modalContent === null) {
|
||||
return null;
|
||||
}
|
||||
const {title, content, closeOnClickOutside} = modalContent;
|
||||
return (
|
||||
<Modal
|
||||
onClose={onClose}
|
||||
title={title}
|
||||
closeOnClickOutside={closeOnClickOutside}>
|
||||
{content}
|
||||
</Modal>
|
||||
);
|
||||
}, [modalContent, onClose]);
|
||||
|
||||
const showModal = useCallback(
|
||||
(
|
||||
title: string,
|
||||
// eslint-disable-next-line no-shadow
|
||||
getContent: (onClose: () => void) => JSX.Element,
|
||||
closeOnClickOutside = false,
|
||||
) => {
|
||||
setModalContent({
|
||||
closeOnClickOutside,
|
||||
content: getContent(onClose),
|
||||
title,
|
||||
});
|
||||
},
|
||||
[onClose],
|
||||
);
|
||||
|
||||
return [modal, showModal];
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
import {useCallback, useEffect, useRef} from 'react';
|
||||
|
||||
const getElement = (): HTMLElement => {
|
||||
let element = document.getElementById('report-container');
|
||||
|
||||
if (element === null) {
|
||||
element = document.createElement('div');
|
||||
element.id = 'report-container';
|
||||
element.style.position = 'fixed';
|
||||
element.style.top = '50%';
|
||||
element.style.left = '50%';
|
||||
element.style.fontSize = '32px';
|
||||
element.style.transform = 'translate(-50%, -50px)';
|
||||
element.style.padding = '20px';
|
||||
element.style.background = 'rgba(240, 240, 240, 0.4)';
|
||||
element.style.borderRadius = '20px';
|
||||
|
||||
if (document.body) {
|
||||
document.body.appendChild(element);
|
||||
}
|
||||
}
|
||||
|
||||
return element;
|
||||
};
|
||||
|
||||
export default function useReport(): (
|
||||
arg0: string,
|
||||
) => ReturnType<typeof setTimeout> {
|
||||
const timer = useRef<ReturnType<typeof setTimeout> | null>(null);
|
||||
const cleanup = useCallback(() => {
|
||||
if (timer !== null) {
|
||||
clearTimeout(timer.current as ReturnType<typeof setTimeout>);
|
||||
}
|
||||
|
||||
if (document.body) {
|
||||
document.body.removeChild(getElement());
|
||||
}
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
return cleanup;
|
||||
}, [cleanup]);
|
||||
|
||||
return useCallback(
|
||||
(content) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(content);
|
||||
const element = getElement();
|
||||
clearTimeout(timer.current as ReturnType<typeof setTimeout>);
|
||||
element.innerHTML = content;
|
||||
timer.current = setTimeout(cleanup, 1000);
|
||||
return timer.current;
|
||||
},
|
||||
[cleanup],
|
||||
);
|
||||
}
|
||||
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,5 @@
|
||||
OpenMoji
|
||||
https://openmoji.org
|
||||
|
||||
Licensed under Attribution-ShareAlike 4.0 International
|
||||
https://creativecommons.org/licenses/by-sa/4.0/
|
||||
@@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-layout-three-columns" viewBox="0 0 16 16">
|
||||
<path d="M0 1.5A1.5 1.5 0 0 1 1.5 0h13A1.5 1.5 0 0 1 16 1.5v13a1.5 1.5 0 0 1-1.5 1.5h-13A1.5 1.5 0 0 1 0 14.5v-13zM1.5 1a.5.5 0 0 0-.5.5v13a.5.5 0 0 0 .5.5H5V1H1.5zM10 15V1H6v14h4zm1 0h3.5a.5.5 0 0 0 .5-.5v-13a.5.5 0 0 0-.5-.5H11v14z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 385 B |
@@ -0,0 +1,5 @@
|
||||
Bootstrap Icons
|
||||
https://icons.getbootstrap.com
|
||||
|
||||
Licensed under MIT license
|
||||
https://github.com/twbs/icons/blob/main/LICENSE.md
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-clockwise"><path fill-rule="evenodd" d="M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z"/><path d="M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466z"/></svg>
|
||||
|
After Width: | Height: | Size: 325 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-counterclockwise"><path fill-rule="evenodd" d="M8 3a5 5 0 1 1-4.546 2.914.5.5 0 0 0-.908-.417A6 6 0 1 0 8 2v1z"/><path d="M8 4.466V.534a.25.25 0 0 0-.41-.192L5.23 2.308a.25.25 0 0 0 0 .384l2.36 1.966A.25.25 0 0 0 8 4.466z"/></svg>
|
||||
|
After Width: | Height: | Size: 332 B |
@@ -0,0 +1 @@
|
||||
<svg width="16" height="16" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#fff" fill-opacity=".01" d="M0 0h48v48H0z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M37 37a4 4 0 0 0 4-4c0-1.473-1.333-3.473-4-6-2.667 2.527-4 4.527-4 6a4 4 0 0 0 4 4Z" fill="#777"/><path d="m20.854 5.504 3.535 3.536" stroke="#777" stroke-width="4" stroke-linecap="round"/><path d="M23.682 8.333 8.125 23.889 19.44 35.203l15.556-15.557L23.682 8.333Z" stroke="#777" stroke-width="4" stroke-linejoin="round"/><path d="m12 20.073 16.961 5.577M4 43h40" stroke="#777" stroke-width="4" stroke-linecap="round"/></svg>
|
||||
|
After Width: | Height: | Size: 626 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-camera"><path d="M15 12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h1.172a3 3 0 0 0 2.12-.879l.83-.828A1 1 0 0 1 6.827 3h2.344a1 1 0 0 1 .707.293l.828.828A3 3 0 0 0 12.828 5H14a1 1 0 0 1 1 1v6zM2 4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2h-1.172a2 2 0 0 1-1.414-.586l-.828-.828A2 2 0 0 0 9.172 2H6.828a2 2 0 0 0-1.414.586l-.828.828A2 2 0 0 1 3.172 4H2z"/><path d="M8 11a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm0 1a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7zM3 6.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0z"/></svg>
|
||||
|
After Width: | Height: | Size: 613 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-card-checklist"><path d="M14.5 3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-13a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h13zm-13-1A1.5 1.5 0 0 0 0 3.5v9A1.5 1.5 0 0 0 1.5 14h13a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 14.5 2h-13z"/><path d="M7 5.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5zm-1.496-.854a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0l-.5-.5a.5.5 0 1 1 .708-.708l.146.147 1.146-1.147a.5.5 0 0 1 .708 0zM7 9.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5zm-1.496-.854a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0l-.5-.5a.5.5 0 0 1 .708-.708l.146.147 1.146-1.147a.5.5 0 0 1 .708 0z"/></svg>
|
||||
|
After Width: | Height: | Size: 703 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-caret-right-fill"><path d="m12.14 8.753-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z"/></svg>
|
||||
|
After Width: | Height: | Size: 244 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chat-left-text"><path d="M14 1a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H4.414A2 2 0 0 0 3 11.586l-2 2V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12.793a.5.5 0 0 0 .854.353l2.853-2.853A1 1 0 0 1 4.414 12H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z"/><path d="M3 3.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zM3 6a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9A.5.5 0 0 1 3 6zm0 2.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5z"/></svg>
|
||||
|
After Width: | Height: | Size: 518 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chat-right-dots"><path d="M2 1a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h9.586a2 2 0 0 1 1.414.586l2 2V2a1 1 0 0 0-1-1H2zm12-1a2 2 0 0 1 2 2v12.793a.5.5 0 0 1-.854.353l-2.853-2.853a1 1 0 0 0-.707-.293H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h12z"/><path d="M5 6a1 1 0 1 1-2 0 1 1 0 0 1 2 0zm4 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0zm4 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0z"/></svg>
|
||||
|
After Width: | Height: | Size: 440 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chat-right-text"><path d="M2 1a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h9.586a2 2 0 0 1 1.414.586l2 2V2a1 1 0 0 0-1-1H2zm12-1a2 2 0 0 1 2 2v12.793a.5.5 0 0 1-.854.353l-2.853-2.853a1 1 0 0 0-.707-.293H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h12z"/><path d="M3 3.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zM3 6a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9A.5.5 0 0 1 3 6zm0 2.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5z"/></svg>
|
||||
|
After Width: | Height: | Size: 520 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chat-right"><path d="M2 1a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h9.586a2 2 0 0 1 1.414.586l2 2V2a1 1 0 0 0-1-1H2zm12-1a2 2 0 0 1 2 2v12.793a.5.5 0 0 1-.854.353l-2.853-2.853a1 1 0 0 0-.707-.293H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h12z"/></svg>
|
||||
|
After Width: | Height: | Size: 324 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chat-square-quote"><path d="M14 1a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1h-2.5a2 2 0 0 0-1.6.8L8 14.333 6.1 11.8a2 2 0 0 0-1.6-.8H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2.5a1 1 0 0 1 .8.4l1.9 2.533a1 1 0 0 0 1.6 0l1.9-2.533a1 1 0 0 1 .8-.4H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z"/><path d="M7.066 4.76A1.665 1.665 0 0 0 4 5.668a1.667 1.667 0 0 0 2.561 1.406c-.131.389-.375.804-.777 1.22a.417.417 0 1 0 .6.58c1.486-1.54 1.293-3.214.682-4.112zm4 0A1.665 1.665 0 0 0 8 5.668a1.667 1.667 0 0 0 2.561 1.406c-.131.389-.375.804-.777 1.22a.417.417 0 1 0 .6.58c1.486-1.54 1.293-3.214.682-4.112z"/></svg>
|
||||
|
After Width: | Height: | Size: 708 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-down"><path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"/></svg>
|
||||
|
After Width: | Height: | Size: 266 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-clipboard"><path d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1h1a1 1 0 0 1 1 1V14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h1v-1z"/><path d="M9.5 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3zm-3-1A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3z"/></svg>
|
||||
|
After Width: | Height: | Size: 469 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.--><path d="M0 256C0 114.6 114.6 0 256 0s256 114.6 256 256-114.6 256-256 256S0 397.4 0 256zm175-47.9 47.1 47L175 303c-9.3 9.4-9.3 24.6 0 33.1 9.4 10.2 24.6 10.2 33.1 0l47-46.2 47.9 46.2c9.4 10.2 24.6 10.2 33.1 0 10.2-8.5 10.2-23.7 0-33.1l-46.2-47.9 46.2-47c10.2-8.5 10.2-23.7 0-33.1-8.5-9.3-23.7-9.3-33.1 0l-47.9 47.1-47-47.1c-8.5-9.3-23.7-9.3-33.1 0-9.3 9.4-9.3 24.6 0 33.1z"/></svg>
|
||||
|
After Width: | Height: | Size: 610 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-code"><path d="M5.854 4.854a.5.5 0 1 0-.708-.708l-3.5 3.5a.5.5 0 0 0 0 .708l3.5 3.5a.5.5 0 0 0 .708-.708L2.707 8l3.147-3.146zm4.292 0a.5.5 0 0 1 .708-.708l3.5 3.5a.5.5 0 0 1 0 .708l-3.5 3.5a.5.5 0 0 1-.708-.708L13.293 8l-3.147-3.146z"/></svg>
|
||||
|
After Width: | Height: | Size: 338 B |
@@ -0,0 +1 @@
|
||||
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M13 5.885v1.166a3.95 3.95 0 0 1-3.949 3.95H6.917a.748.748 0 0 0-.45.15l-1.345 1.007a.752.752 0 0 0-.032 1.181A2.933 2.933 0 0 0 6.95 14h2.716l2.534 1.901a.506.506 0 0 0 .524.047A.501.501 0 0 0 13 15.5V14h.051a2.949 2.949 0 0 0 2.95-2.949v-3.05a3.002 3.002 0 0 0-2.002-2.83.756.756 0 0 0-.999.714" fill="#050505"/><path fill-rule="evenodd" clip-rule="evenodd" d="M9.05 1H2.95A2.952 2.952 0 0 0 0 3.949v3.102A2.952 2.952 0 0 0 2.949 10H3v1.5a.502.502 0 0 0 .8.4L6.334 10H9.05A2.952 2.952 0 0 0 12 7.05V3.95A2.952 2.952 0 0 0 9.05 1" fill="#050505"/></svg>
|
||||
|
After Width: | Height: | Size: 677 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000"><path d="M710 10H360c-38.6 0-70 31.4-70 70v630c0 38.6 31.4 70 70 70h490c38.6 0 70-31.4 70-70V220L710 10zm0 99 111 111H710V109zm140 601H360V80h280v210h210v420z"/><path d="M430 360h350v70H430v-70zm0 140h350v70H430v-70z"/><path d="M640 920H150V290h70v-70h-70c-38.6 0-70 31.4-70 70v630c0 38.6 31.4 70 70 70h490c38.6 0 70-31.4 70-70v-70h-70v70z"/></svg>
|
||||
|
After Width: | Height: | Size: 412 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-diagram-2"><path fill-rule="evenodd" d="M6 3.5A1.5 1.5 0 0 1 7.5 2h1A1.5 1.5 0 0 1 10 3.5v1A1.5 1.5 0 0 1 8.5 6v1H11a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-1 0V8h-5v.5a.5.5 0 0 1-1 0v-1A.5.5 0 0 1 5 7h2.5V6A1.5 1.5 0 0 1 6 4.5v-1zM8.5 5a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h1zM3 11.5A1.5 1.5 0 0 1 4.5 10h1A1.5 1.5 0 0 1 7 11.5v1A1.5 1.5 0 0 1 5.5 14h-1A1.5 1.5 0 0 1 3 12.5v-1zm1.5-.5a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1zm4.5.5a1.5 1.5 0 0 1 1.5-1.5h1a1.5 1.5 0 0 1 1.5 1.5v1a1.5 1.5 0 0 1-1.5 1.5h-1A1.5 1.5 0 0 1 9 12.5v-1zm1.5-.5a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1z"/></svg>
|
||||
|
After Width: | Height: | Size: 782 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-download"><path d="M.5 9.9a.5.5 0 0 1 .5.5v2.5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-2.5a.5.5 0 0 1 1 0v2.5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-2.5a.5.5 0 0 1 .5-.5z"/><path d="M7.646 11.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V1.5a.5.5 0 0 0-1 0v8.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3z"/></svg>
|
||||
|
After Width: | Height: | Size: 400 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" viewBox="0 0 24 24" fill="currentColor"><path stroke="currentColor" d="M8.5 10a2 2 0 1 0 2 2 2 2 0 0 0-2-2Zm0 7a2 2 0 1 0 2 2 2 2 0 0 0-2-2Zm7-10a2 2 0 1 0-2-2 2 2 0 0 0 2 2Zm-7-4a2 2 0 1 0 2 2 2 2 0 0 0-2-2Zm7 14a2 2 0 1 0 2 2 2 2 0 0 0-2-2Zm0-7a2 2 0 1 0 2 2 2 2 0 0 0-2-2Z"/></svg>
|
||||
|
After Width: | Height: | Size: 344 B |
@@ -0,0 +1 @@
|
||||
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M4.648 4.475 1.824 12.25H.67l3.252-8.531h.744l-.018.756Zm2.368 7.775-2.83-7.775-.018-.756h.744l3.264 8.531h-1.16Zm-.147-3.158v.926H2.076v-.926H6.87Zm6.024 2.074V7.902c0-.25-.051-.466-.153-.65a.997.997 0 0 0-.445-.434c-.2-.101-.445-.152-.738-.152-.274 0-.514.047-.721.14a1.255 1.255 0 0 0-.48.37.809.809 0 0 0-.17.492H9.101c0-.227.058-.451.175-.674.118-.223.286-.424.504-.603.223-.184.489-.329.797-.434.313-.11.66-.164 1.043-.164.461 0 .867.078 1.219.234.355.157.633.393.832.71.203.312.305.704.305 1.177v2.953c0 .211.017.436.052.674.04.238.096.443.17.615v.094h-1.13a2.022 2.022 0 0 1-.13-.498 4.011 4.011 0 0 1-.046-.586Zm.187-2.76.012.762h-1.096c-.309 0-.584.025-.826.076a1.89 1.89 0 0 0-.61.217.979.979 0 0 0-.504.879c0 .2.046.38.135.545a.98.98 0 0 0 .405.392c.183.094.408.141.674.141.332 0 .625-.07.878-.211a1.83 1.83 0 0 0 .604-.516c.152-.203.234-.4.246-.591l.463.521a1.572 1.572 0 0 1-.223.545 2.607 2.607 0 0 1-1.2 1.025 2.328 2.328 0 0 1-.927.176c-.43 0-.806-.084-1.13-.252a1.933 1.933 0 0 1-.75-.674 1.784 1.784 0 0 1-.264-.955c0-.34.066-.638.199-.896a1.73 1.73 0 0 1 .574-.65c.25-.176.551-.31.903-.399a4.76 4.76 0 0 1 1.177-.135h1.26Z" fill="#000"/></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.--><path d="M14 95.792C14 42.888 56.888 0 109.793 0h164.368c52.905 0 95.793 42.888 95.793 95.792 0 33.5-17.196 62.984-43.243 80.105 26.047 17.122 43.243 46.605 43.243 80.105 0 52.905-42.888 95.793-95.793 95.793h-2.08c-24.802 0-47.403-9.426-64.415-24.891v88.263c0 53.61-44.009 96.833-97.357 96.833C57.536 512 14 469.243 14 416.207c0-33.498 17.195-62.98 43.24-80.102C31.193 318.983 14 289.5 14 256.002c0-33.5 17.196-62.983 43.242-80.105C31.197 158.776 14 129.292 14 95.792Zm162.288 95.795h-66.495c-35.576 0-64.415 28.84-64.415 64.415 0 35.438 28.617 64.192 64.003 64.414l.412-.001h66.495V191.587Zm31.378 64.415c0 35.575 28.839 64.415 64.415 64.415h2.08c35.576 0 64.415-28.84 64.415-64.415s-28.839-64.415-64.415-64.415h-2.08c-35.576 0-64.415 28.84-64.415 64.415Zm-97.873 95.793-.412-.001c-35.386.221-64.003 28.975-64.003 64.413 0 35.445 29.225 64.415 64.931 64.415 36.282 0 65.979-29.436 65.979-65.455v-63.372h-66.495Zm0-320.417c-35.576 0-64.415 28.84-64.415 64.414 0 35.576 28.84 64.415 64.415 64.415h66.495V31.377h-66.495Zm97.873 128.829h66.495c35.576 0 64.415-28.839 64.415-64.415 0-35.575-28.839-64.414-64.415-64.414h-66.495v128.829Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-earmark-text" viewBox="0 0 16 16">
|
||||
<path d="M5.5 7a.5.5 0 0 0 0 1h5a.5.5 0 0 0 0-1h-5zM5 9.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5zm0 2a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5z"/>
|
||||
<path d="M9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.5L9.5 0zm0 1v2A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 483 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-image"><path d="M8.002 5.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"/><path d="M12 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zM3 2a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v8l-2.083-2.083a.5.5 0 0 0-.76.063L8 11 5.835 9.7a.5.5 0 0 0-.611.076L3 12V2z"/></svg>
|
||||
|
After Width: | Height: | Size: 367 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-filetype-gif"><path fill-rule="evenodd" d="M14 4.5V14a2 2 0 0 1-2 2H9v-1h3a1 1 0 0 0 1-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5ZM3.278 13.124a1.403 1.403 0 0 0-.14-.492 1.317 1.317 0 0 0-.314-.407 1.447 1.447 0 0 0-.48-.275 1.88 1.88 0 0 0-.636-.1c-.361 0-.67.076-.926.229a1.48 1.48 0 0 0-.583.632 2.136 2.136 0 0 0-.199.95v.506c0 .272.035.52.105.745.07.224.177.417.32.58.142.162.32.288.533.377.215.088.466.132.753.132.268 0 .5-.037.697-.111a1.29 1.29 0 0 0 .788-.77c.065-.174.097-.358.097-.551v-.797H1.717v.589h.823v.255c0 .132-.03.254-.09.363a.67.67 0 0 1-.273.264.967.967 0 0 1-.457.096.87.87 0 0 1-.519-.146.881.881 0 0 1-.305-.413 1.785 1.785 0 0 1-.096-.615v-.499c0-.365.078-.648.234-.85.158-.2.38-.301.665-.301a.96.96 0 0 1 .3.044c.09.03.17.071.236.126a.689.689 0 0 1 .17.19.797.797 0 0 1 .097.25h.776Zm1.353 2.801v-3.999H3.84v4h.79Zm1.493-1.59v1.59h-.791v-3.999H7.88v.653H6.124v1.117h1.605v.638H6.124Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 512 512"><path fill="#777" d="M221.631 109 109.92 392h58.055l24.079-61h127.892l24.079 61h58.055L290.369 109Zm-8.261 168L256 169l42.63 108Z"/></svg>
|
||||
|
After Width: | Height: | Size: 223 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-fonts"><path d="M12.258 3h-8.51l-.083 2.46h.479c.26-1.544.758-1.783 2.693-1.845l.424-.013v7.827c0 .663-.144.82-1.3.923v.52h4.082v-.52c-1.162-.103-1.306-.26-1.306-.923V3.602l.431.013c1.934.062 2.434.301 2.693 1.846h.479L12.258 3z"/></svg>
|
||||
|
After Width: | Height: | Size: 333 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-gear"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492zM5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0z"/><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52l-.094-.319zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.377l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115l.094-.319z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-break"><path d="M0 10.5a.5.5 0 0 1 .5-.5h15a.5.5 0 0 1 0 1H.5a.5.5 0 0 1-.5-.5zM12 0H4a2 2 0 0 0-2 2v7h1V2a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v7h1V2a2 2 0 0 0-2-2zm2 12h-1v2a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-2H2v2a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2v-2z"/></svg>
|
||||
|
After Width: | Height: | Size: 348 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-text-indent-left"><path d="M2 3.5a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5zm.646 2.146a.5.5 0 0 1 .708 0l2 2a.5.5 0 0 1 0 .708l-2 2a.5.5 0 0 1-.708-.708L4.293 8 2.646 6.354a.5.5 0 0 1 0-.708zM7 6.5a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1h-6a.5.5 0 0 1-.5-.5zm0 3a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1h-6a.5.5 0 0 1-.5-.5zm-5 3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5z"/></svg>
|
||||
|
After Width: | Height: | Size: 493 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-journal-code"><path fill-rule="evenodd" d="M8.646 5.646a.5.5 0 0 1 .708 0l2 2a.5.5 0 0 1 0 .708l-2 2a.5.5 0 0 1-.708-.708L10.293 8 8.646 6.354a.5.5 0 0 1 0-.708zm-1.292 0a.5.5 0 0 0-.708 0l-2 2a.5.5 0 0 0 0 .708l2 2a.5.5 0 0 0 .708-.708L5.707 8l1.647-1.646a.5.5 0 0 0 0-.708z"/><path d="M3 0h10a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2v-1h1v1a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v1H1V2a2 2 0 0 1 2-2z"/><path d="M1 5v-.5a.5.5 0 0 1 1 0V5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1zm0 3v-.5a.5.5 0 0 1 1 0V8h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1zm0 3v-.5a.5.5 0 0 1 1 0v.5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1z"/></svg>
|
||||
|
After Width: | Height: | Size: 742 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-journal-text"><path d="M5 10.5a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5zm0-2a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5zm0-2a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5zm0-2a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5z"/><path d="M3 0h10a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2v-1h1v1a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v1H1V2a2 2 0 0 1 2-2z"/><path d="M1 5v-.5a.5.5 0 0 1 1 0V5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1zm0 3v-.5a.5.5 0 0 1 1 0V8h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1zm0 3v-.5a.5.5 0 0 1 1 0v.5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1z"/></svg>
|
||||
|
After Width: | Height: | Size: 729 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-justify"><path fill-rule="evenodd" d="M2 12.5a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5zm0-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5zm0-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5zm0-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5z"/></svg>
|
||||
|
After Width: | Height: | Size: 390 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-link"><path d="M6.354 5.5H4a3 3 0 0 0 0 6h3a3 3 0 0 0 2.83-4H9c-.086 0-.17.01-.25.031A2 2 0 0 1 7 10.5H4a2 2 0 1 1 0-4h1.535c.218-.376.495-.714.82-1z"/><path d="M9 5.5a3 3 0 0 0-2.83 4h1.098A2 2 0 0 1 9 6.5h3a2 2 0 1 1 0 4h-1.535a4.02 4.02 0 0 1-.82 1H12a3 3 0 1 0 0-6H9z"/></svg>
|
||||
|
After Width: | Height: | Size: 376 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-list-ol"><path fill-rule="evenodd" d="M5 11.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5z"/><path d="M1.713 11.865v-.474H2c.217 0 .363-.137.363-.317 0-.185-.158-.31-.361-.31-.223 0-.367.152-.373.31h-.59c.016-.467.373-.787.986-.787.588-.002.954.291.957.703a.595.595 0 0 1-.492.594v.033a.615.615 0 0 1 .569.631c.003.533-.502.8-1.051.8-.656 0-1-.37-1.008-.794h.582c.008.178.186.306.422.309.254 0 .424-.145.422-.35-.002-.195-.155-.348-.414-.348h-.3zm-.004-4.699h-.604v-.035c0-.408.295-.844.958-.844.583 0 .96.326.96.756 0 .389-.257.617-.476.848l-.537.572v.03h1.054V9H1.143v-.395l.957-.99c.138-.142.293-.304.293-.508 0-.18-.147-.32-.342-.32a.33.33 0 0 0-.342.338v.041zM2.564 5h-.635V2.924h-.031l-.598.42v-.567l.629-.443h.635V5z"/></svg>
|
||||
|
After Width: | Height: | Size: 956 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-list-ul"><path fill-rule="evenodd" d="M5 11.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zm-3 1a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm0 4a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm0 4a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></svg>
|
||||
|
After Width: | Height: | Size: 423 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-lock-fill"><path d="M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2z"/></svg>
|
||||
|
After Width: | Height: | Size: 249 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-lock"><path d="M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2zM5 8h6a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1z"/></svg>
|
||||
|
After Width: | Height: | Size: 313 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-markdown"><path d="M14 3a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h12zM2 2a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H2z"/><path fill-rule="evenodd" d="M9.146 8.146a.5.5 0 0 1 .708 0L11.5 9.793l1.646-1.647a.5.5 0 0 1 .708.708l-2 2a.5.5 0 0 1-.708 0l-2-2a.5.5 0 0 1 0-.708z"/><path fill-rule="evenodd" d="M11.5 5a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-1 0v-4a.5.5 0 0 1 .5-.5z"/><path d="M3.56 11V7.01h.056l1.428 3.239h.774l1.42-3.24h.056V11h1.073V5.001h-1.2l-1.71 3.894h-.039l-1.71-3.894H2.5V11h1.06z"/></svg>
|
||||
|
After Width: | Height: | Size: 635 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-mic"><path d="M3.5 6.5A.5.5 0 0 1 4 7v1a4 4 0 0 0 8 0V7a.5.5 0 0 1 1 0v1a5 5 0 0 1-4.5 4.975V15h3a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1h3v-2.025A5 5 0 0 1 3 8V7a.5.5 0 0 1 .5-.5z"/><path d="M10 8a2 2 0 1 1-4 0V3a2 2 0 1 1 4 0v5zM8 0a3 3 0 0 0-3 3v5a3 3 0 0 0 6 0V3a3 3 0 0 0-3-3z"/></svg>
|
||||
|
After Width: | Height: | Size: 379 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-text-indent-right"><path d="M2 3.5a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5zm10.646 2.146a.5.5 0 0 1 .708.708L11.707 8l1.647 1.646a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708l2-2zM2 6.5a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1h-6a.5.5 0 0 1-.5-.5zm0 3a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1h-6a.5.5 0 0 1-.5-.5zm0 3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5z"/></svg>
|
||||
|
After Width: | Height: | Size: 479 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-paint-bucket"><path d="M6.192 2.78c-.458-.677-.927-1.248-1.35-1.643a2.972 2.972 0 0 0-.71-.515c-.217-.104-.56-.205-.882-.02-.367.213-.427.63-.43.896-.003.304.064.664.173 1.044.196.687.556 1.528 1.035 2.402L.752 8.22c-.277.277-.269.656-.218.918.055.283.187.593.36.903.348.627.92 1.361 1.626 2.068.707.707 1.441 1.278 2.068 1.626.31.173.62.305.903.36.262.05.64.059.918-.218l5.615-5.615c.118.257.092.512.05.939-.03.292-.068.665-.073 1.176v.123h.003a1 1 0 0 0 1.993 0H14v-.057a1.01 1.01 0 0 0-.004-.117c-.055-1.25-.7-2.738-1.86-3.494a4.322 4.322 0 0 0-.211-.434c-.349-.626-.92-1.36-1.627-2.067-.707-.707-1.441-1.279-2.068-1.627-.31-.172-.62-.304-.903-.36-.262-.05-.64-.058-.918.219l-.217.216zM4.16 1.867c.381.356.844.922 1.311 1.632l-.704.705c-.382-.727-.66-1.402-.813-1.938a3.283 3.283 0 0 1-.131-.673c.091.061.204.15.337.274zm.394 3.965c.54.852 1.107 1.567 1.607 2.033a.5.5 0 1 0 .682-.732c-.453-.422-1.017-1.136-1.564-2.027l1.088-1.088c.054.12.115.243.183.365.349.627.92 1.361 1.627 2.068.706.707 1.44 1.278 2.068 1.626.122.068.244.13.365.183l-4.861 4.862a.571.571 0 0 1-.068-.01c-.137-.027-.342-.104-.608-.252-.524-.292-1.186-.8-1.846-1.46-.66-.66-1.168-1.32-1.46-1.846-.147-.265-.225-.47-.251-.607a.573.573 0 0 1-.01-.068l3.048-3.047zm2.87-1.935a2.44 2.44 0 0 1-.241-.561c.135.033.324.11.562.241.524.292 1.186.8 1.846 1.46.45.45.83.901 1.118 1.31a3.497 3.497 0 0 0-1.066.091 11.27 11.27 0 0 1-.76-.694c-.66-.66-1.167-1.322-1.458-1.847z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-palette"><path d="M8 5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zm4 3a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zM5.5 7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm.5 6a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z"/><path d="M16 8c0 3.15-1.866 2.585-3.567 2.07C11.42 9.763 10.465 9.473 10 10c-.603.683-.475 1.819-.351 2.92C9.826 14.495 9.996 16 8 16a8 8 0 1 1 8-8zm-8 7c.611 0 .654-.171.655-.176.078-.146.124-.464.07-1.119-.014-.168-.037-.37-.061-.591-.052-.464-.112-1.005-.118-1.462-.01-.707.083-1.61.704-2.314.369-.417.845-.578 1.272-.618.404-.038.812.026 1.16.104.343.077.702.186 1.025.284l.028.008c.346.105.658.199.953.266.653.148.904.083.991.024C14.717 9.38 15 9.161 15 8a7 7 0 1 0-7 7z"/></svg>
|
||||
|
After Width: | Height: | Size: 768 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-pencil-fill"><path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/></svg>
|
||||
|
After Width: | Height: | Size: 565 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plug-fill"><path d="M6 0a.5.5 0 0 1 .5.5V3h3V.5a.5.5 0 0 1 1 0V3h1a.5.5 0 0 1 .5.5v3A3.5 3.5 0 0 1 8.5 10c-.002.434-.01.845-.04 1.22-.041.514-.126 1.003-.317 1.424a2.083 2.083 0 0 1-.97 1.028C6.725 13.9 6.169 14 5.5 14c-.998 0-1.61.33-1.974.718A1.922 1.922 0 0 0 3 16H2c0-.616.232-1.367.797-1.968C3.374 13.42 4.261 13 5.5 13c.581 0 .962-.088 1.218-.219.241-.123.4-.3.514-.55.121-.266.193-.621.23-1.09.027-.34.035-.718.037-1.141A3.5 3.5 0 0 1 4 6.5v-3a.5.5 0 0 1 .5-.5h1V.5A.5.5 0 0 1 6 0z"/></svg>
|
||||
|
After Width: | Height: | Size: 593 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plug"><path d="M6 0a.5.5 0 0 1 .5.5V3h3V.5a.5.5 0 0 1 1 0V3h1a.5.5 0 0 1 .5.5v3A3.5 3.5 0 0 1 8.5 10c-.002.434-.01.845-.04 1.22-.041.514-.126 1.003-.317 1.424a2.083 2.083 0 0 1-.97 1.028C6.725 13.9 6.169 14 5.5 14c-.998 0-1.61.33-1.974.718A1.922 1.922 0 0 0 3 16H2c0-.616.232-1.367.797-1.968C3.374 13.42 4.261 13 5.5 13c.581 0 .962-.088 1.218-.219.241-.123.4-.3.514-.55.121-.266.193-.621.23-1.09.027-.34.035-.718.037-1.141A3.5 3.5 0 0 1 4 6.5v-3a.5.5 0 0 1 .5-.5h1V.5A.5.5 0 0 1 6 0zM5 4v2.5A2.5 2.5 0 0 0 7.5 9h1A2.5 2.5 0 0 0 11 6.5V4H5z"/></svg>
|
||||
|
After Width: | Height: | Size: 644 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plus-slash-minus"><path d="m1.854 14.854 13-13a.5.5 0 0 0-.708-.708l-13 13a.5.5 0 0 0 .708.708ZM4 1a.5.5 0 0 1 .5.5v2h2a.5.5 0 0 1 0 1h-2v2a.5.5 0 0 1-1 0v-2h-2a.5.5 0 0 1 0-1h2v-2A.5.5 0 0 1 4 1Zm5 11a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5A.5.5 0 0 1 9 12Z"/></svg>
|
||||
|
After Width: | Height: | Size: 360 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plus"><path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"/></svg>
|
||||
|
After Width: | Height: | Size: 221 B |
@@ -0,0 +1 @@
|
||||
<svg style="color:red" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M8.571 23.429A.571.571 0 0 1 8 24H2.286a.571.571 0 0 1 0-1.143H8c.316 0 .571.256.571.572zM8 20.57H6.857a.571.571 0 0 0 0 1.143H8a.571.571 0 0 0 0-1.143zm-5.714 1.143H4.57a.571.571 0 0 0 0-1.143H2.286a.571.571 0 0 0 0 1.143zM8 18.286H2.286a.571.571 0 0 0 0 1.143H8a.571.571 0 0 0 0-1.143zM16 16H5.714a.571.571 0 0 0 0 1.143H16A.571.571 0 0 0 16 16zM2.286 17.143h1.143a.571.571 0 0 0 0-1.143H2.286a.571.571 0 0 0 0 1.143zm17.143-3.429H16a.571.571 0 0 0 0 1.143h3.429a.571.571 0 0 0 0-1.143zM9.143 14.857h4.571a.571.571 0 0 0 0-1.143H9.143a.571.571 0 0 0 0 1.143zm-6.857 0h4.571a.571.571 0 0 0 0-1.143H2.286a.571.571 0 0 0 0 1.143zM20.57 11.43h-9.14a.571.571 0 0 0 0 1.142h9.142a.571.571 0 0 0 0-1.142zM9.714 12a.571.571 0 0 0-.571-.571H5.714a.571.571 0 0 0 0 1.142h3.429A.571.571 0 0 0 9.714 12zm-7.428.571h1.143a.571.571 0 0 0 0-1.142H2.286a.571.571 0 0 0 0 1.142zm19.428-3.428H16a.571.571 0 0 0 0 1.143h5.714a.571.571 0 0 0 0-1.143zM2.286 10.286H8a.571.571 0 0 0 0-1.143H2.286a.571.571 0 0 0 0 1.143zm13.143-2.857A.57.57 0 0 0 16 8h5.714a.571.571 0 0 0 0-1.143H16a.571.571 0 0 0-.571.572zm-8.572-.572a.571.571 0 0 0 0 1.143H8a.571.571 0 0 0 0-1.143H6.857zM2.286 8H4.57a.571.571 0 0 0 0-1.143H2.286a.571.571 0 0 0 0 1.143zm16.571-2.857c0 .315.256.571.572.571h1.142a.571.571 0 0 0 0-1.143H19.43a.571.571 0 0 0-.572.572zm-1.143 0a.571.571 0 0 0-.571-.572H12.57a.571.571 0 0 0 0 1.143h4.572a.571.571 0 0 0 .571-.571zm-15.428.571h8a.571.571 0 0 0 0-1.143h-8a.571.571 0 0 0 0 1.143zm5.143-2.857c0 .316.255.572.571.572h11.429a.571.571 0 0 0 0-1.143H8a.571.571 0 0 0-.571.571zm-5.143.572h3.428a.571.571 0 0 0 0-1.143H2.286a.571.571 0 0 0 0 1.143zm0-2.286H16A.571.571 0 0 0 16 0H2.286a.571.571 0 0 0 0 1.143z" fill="red"/></svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M8.571 23.429A.571.571 0 0 1 8 24H2.286a.571.571 0 0 1 0-1.143H8c.316 0 .571.256.571.572zM8 20.57H6.857a.571.571 0 0 0 0 1.143H8a.571.571 0 0 0 0-1.143zm-5.714 1.143H4.57a.571.571 0 0 0 0-1.143H2.286a.571.571 0 0 0 0 1.143zM8 18.286H2.286a.571.571 0 0 0 0 1.143H8a.571.571 0 0 0 0-1.143zM16 16H5.714a.571.571 0 0 0 0 1.143H16A.571.571 0 0 0 16 16zM2.286 17.143h1.143a.571.571 0 0 0 0-1.143H2.286a.571.571 0 0 0 0 1.143zm17.143-3.429H16a.571.571 0 0 0 0 1.143h3.429a.571.571 0 0 0 0-1.143zM9.143 14.857h4.571a.571.571 0 0 0 0-1.143H9.143a.571.571 0 0 0 0 1.143zm-6.857 0h4.571a.571.571 0 0 0 0-1.143H2.286a.571.571 0 0 0 0 1.143zM20.57 11.43h-9.14a.571.571 0 0 0 0 1.142h9.142a.571.571 0 0 0 0-1.142zM9.714 12a.571.571 0 0 0-.571-.571H5.714a.571.571 0 0 0 0 1.142h3.429A.571.571 0 0 0 9.714 12zm-7.428.571h1.143a.571.571 0 0 0 0-1.142H2.286a.571.571 0 0 0 0 1.142zm19.428-3.428H16a.571.571 0 0 0 0 1.143h5.714a.571.571 0 0 0 0-1.143zM2.286 10.286H8a.571.571 0 0 0 0-1.143H2.286a.571.571 0 0 0 0 1.143zm13.143-2.857A.57.57 0 0 0 16 8h5.714a.571.571 0 0 0 0-1.143H16a.571.571 0 0 0-.571.572zm-8.572-.572a.571.571 0 0 0 0 1.143H8a.571.571 0 0 0 0-1.143H6.857zM2.286 8H4.57a.571.571 0 0 0 0-1.143H2.286a.571.571 0 0 0 0 1.143zm16.571-2.857c0 .315.256.571.572.571h1.142a.571.571 0 0 0 0-1.143H19.43a.571.571 0 0 0-.572.572zm-1.143 0a.571.571 0 0 0-.571-.572H12.57a.571.571 0 0 0 0 1.143h4.572a.571.571 0 0 0 .571-.571zm-15.428.571h8a.571.571 0 0 0 0-1.143h-8a.571.571 0 0 0 0 1.143zm5.143-2.857c0 .316.255.572.571.572h11.429a.571.571 0 0 0 0-1.143H8a.571.571 0 0 0-.571.571zm-5.143.572h3.428a.571.571 0 0 0 0-1.143H2.286a.571.571 0 0 0 0 1.143zm0-2.286H16A.571.571 0 0 0 16 0H2.286a.571.571 0 0 0 0 1.143z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-scissors" viewBox="0 0 16 16" transform="matrix(-1, 0, 0, 1, 0, 0)rotate(270)">
|
||||
<path d="M3.5 3.5c-.614-.884-.074-1.962.858-2.5L8 7.226 11.642 1c.932.538 1.472 1.616.858 2.5L8.81 8.61l1.556 2.661a2.5 2.5 0 1 1-.794.637L8 9.73l-1.572 2.177a2.5 2.5 0 1 1-.794-.637L7.19 8.61 3.5 3.5zm2.5 10a1.5 1.5 0 1 0-3 0 1.5 1.5 0 0 0 3 0zm7 0a1.5 1.5 0 1 0-3 0 1.5 1.5 0 0 0 3 0z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 474 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-send"><path d="M15.854.146a.5.5 0 0 1 .11.54l-5.819 14.547a.75.75 0 0 1-1.329.124l-3.178-4.995L.643 7.184a.75.75 0 0 1 .124-1.33L15.314.037a.5.5 0 0 1 .54.11ZM6.636 10.07l2.761 4.338L14.13 2.576 6.636 10.07Zm6.787-8.201L1.591 6.602l4.339 2.76 7.494-7.493Z"/></svg>
|
||||
|
After Width: | Height: | Size: 360 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-check-square"><path d="M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z"/><path d="M10.97 4.97a.75.75 0 0 1 1.071 1.05l-3.992 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.235.235 0 0 1 .02-.022z"/></svg>
|
||||
|
After Width: | Height: | Size: 435 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-sticky"><path d="M2.5 1A1.5 1.5 0 0 0 1 2.5v11A1.5 1.5 0 0 0 2.5 15h6.086a1.5 1.5 0 0 0 1.06-.44l4.915-4.914A1.5 1.5 0 0 0 15 8.586V2.5A1.5 1.5 0 0 0 13.5 1h-11zM2 2.5a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 .5.5V8H9.5A1.5 1.5 0 0 0 8 9.5V14H2.5a.5.5 0 0 1-.5-.5v-11zm7 11.293V9.5a.5.5 0 0 1 .5-.5h4.293L9 13.793z"/></svg>
|
||||
|
After Width: | Height: | Size: 409 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50"><circle cx="25" cy="25" r="25" fill="#000"/><path fill="none" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M38 15 22 33l-10-8"/></svg>
|
||||
|
After Width: | Height: | Size: 253 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50"><circle cx="25" cy="25" r="25" fill="#25ae88"/><path fill="none" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M38 15 22 33l-10-8"/></svg>
|
||||
|
After Width: | Height: | Size: 256 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-table"><path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm15 2h-4v3h4V4zm0 4h-4v3h4V8zm0 4h-4v3h3a1 1 0 0 0 1-1v-2zm-5 3v-3H6v3h4zm-5 0v-3H1v2a1 1 0 0 0 1 1h3zm-4-4h4V8H1v3zm0-4h4V4H1v3zm5-3v3h4V4H6zm4 4H6v3h4V8z"/></svg>
|
||||
|
After Width: | Height: | Size: 347 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-text-center"><path fill-rule="evenodd" d="M4 12.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5zm2-3a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5z"/></svg>
|
||||
|
After Width: | Height: | Size: 392 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-text-left"><path fill-rule="evenodd" d="M2 12.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm0-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5zm0-3a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm0-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5z"/></svg>
|
||||
|
After Width: | Height: | Size: 388 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-text-paragraph"><path fill-rule="evenodd" d="M2 12.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm0-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5zm0-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5zm4-3a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5z"/></svg>
|
||||
|
After Width: | Height: | Size: 393 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-text-right"><path fill-rule="evenodd" d="M6 12.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-4-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5zm4-3a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-4-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5z"/></svg>
|
||||
|
After Width: | Height: | Size: 391 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-trash"><path d="M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6z"/><path fill-rule="evenodd" d="M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1zM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118zM2.5 3V2h11v1h-11z"/></svg>
|
||||
|
After Width: | Height: | Size: 546 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-trash3"><path d="M6.5 1h3a.5.5 0 0 1 .5.5v1H6v-1a.5.5 0 0 1 .5-.5ZM11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3A1.5 1.5 0 0 0 5 1.5v1H2.506a.58.58 0 0 0-.01 0H1.5a.5.5 0 0 0 0 1h.538l.853 10.66A2 2 0 0 0 4.885 16h6.23a2 2 0 0 0 1.994-1.84l.853-10.66h.538a.5.5 0 0 0 0-1h-.995a.59.59 0 0 0-.01 0H11Zm1.958 1-.846 10.58a1 1 0 0 1-.997.92h-6.23a1 1 0 0 1-.997-.92L3.042 3.5h9.916Zm-7.487 1a.5.5 0 0 1 .528.47l.5 8.5a.5.5 0 0 1-.998.06L5 5.03a.5.5 0 0 1 .47-.53Zm5.058 0a.5.5 0 0 1 .47.53l-.5 8.5a.5.5 0 1 1-.998-.06l.5-8.5a.5.5 0 0 1 .528-.47ZM8 4.5a.5.5 0 0 1 .5.5v8.5a.5.5 0 0 1-1 0V5a.5.5 0 0 1 .5-.5Z"/></svg>
|
||||
|
After Width: | Height: | Size: 694 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-twitter"><path d="M5.026 15c6.038 0 9.341-5.003 9.341-9.334 0-.14 0-.282-.006-.422A6.685 6.685 0 0 0 16 3.542a6.658 6.658 0 0 1-1.889.518 3.301 3.301 0 0 0 1.447-1.817 6.533 6.533 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.325 9.325 0 0 1-6.767-3.429 3.289 3.289 0 0 0 1.018 4.382A3.323 3.323 0 0 1 .64 6.575v.045a3.288 3.288 0 0 0 2.632 3.218 3.203 3.203 0 0 1-.865.115 3.23 3.23 0 0 1-.614-.057 3.283 3.283 0 0 0 3.067 2.277A6.588 6.588 0 0 1 .78 13.58a6.32 6.32 0 0 1-.78-.045A9.344 9.344 0 0 0 5.026 15z"/></svg>
|
||||
|
After Width: | Height: | Size: 616 B |