`[[VLAN plan]]` only resolves if you remember the exact title or slug, and nothing in the editor told you either. Typing `[[` now opens a picker at the caret: filter, pick, and the finished link is written. It offers documents only. A device with no document is not a link target — a link at one renders red — and creating a document from inside an unsaved editor is a different feature; a device that is documented is in the list through its document, labelled as such. A target is addressed by title, or as `[[doc:<id>]]` when another document shares that title. A bare link resolves by title, so an ambiguous one would silently point at whichever document came first. The second bracket is swallowed on purpose. Opening the menu moves focus to its filter field, and a character typed as focus moves is not reliably delivered to either box, so the body holds exactly one `[` and that is what the insertion replaces. Cancelling puts the second bracket back, so what was typed survives whichever way the menu closes. The popover itself is extracted as EditorMenu and the `/` insert menu now uses it too — same filter field over a labelled list, placed at the caret and measured before it is shown, and two copies of that would have drifted. ha-relevant: no
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 uses Babel (or oxc when used in rolldown-vite) for Fast Refresh
- @vitejs/plugin-react-swc uses SWC for Fast Refresh
React Compiler
The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see this documentation.
Expanding the ESLint configuration
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
// Other configs...
// Remove tseslint.configs.recommended and replace with this
tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
tseslint.configs.stylisticTypeChecked,
// Other configs...
],
languageOptions: {
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
// other options...
},
},
])
You can also install eslint-plugin-react-x and eslint-plugin-react-dom for React-specific lint rules:
// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'
export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
// Other configs...
// Enable lint rules for React
reactX.configs['recommended-typescript'],
// Enable lint rules for React DOM
reactDom.configs.recommended,
],
languageOptions: {
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
// other options...
},
},
])