From a7d0ac15ee52b6b0c32ed09f3378a032f85c2820 Mon Sep 17 00:00:00 2001 From: MDietermann Date: Fri, 28 Aug 2026 09:19:36 +0200 Subject: [PATCH 1/2] chore: Tailwind und die npm-Toolchain entfernen Die App hat nie eine Tailwind-Utility benutzt - saemtliche Klassen im Code sind eigene (btn, files-bar, empty-state, ...), und den Reset liefert base.css selbst. Damit standen package.json, node_modules und ein Build-Schritt fuer eine Stylesheet-Datei, die nichts beigetragen hat. Aufgefallen ist es, weil der letzte Commit ungefragt zwoelf Zeilen in assets/tailwind.css mitbrachte: Der Generator scannt auch docs/ und erzeugte Utilities fuer Woerter, die er in Prosa fand. Die npm-Abhaengigkeit war ohnehin wirkungslos - Dioxus 0.7 bringt Tailwind selbst mit (erzeugt wurde 4.1.5, nicht die in package.json deklarierte 4.3.3). Ohne die Eingabedatei tailwind.css im Projektwurzelverzeichnis erzeugt dx nichts mehr; verifiziert durch einen vollstaendigen Build. Das --dn-Praefix der Tokens bleibt: Es war urspruenglich Schutz vor Tailwinds eigenen :root-Variablen, taugt aber weiterhin als Namensraum. README auf den tatsaechlichen Projektstand gebracht - er beschrieb noch die Dioxus-Vorlage mit einer einzelnen main.rs. --- .gitignore | 3 --- README.md | 61 +++++++++++++++---------------------------- assets/css/tokens.css | 6 ++--- package-lock.json | 18 ------------- package.json | 5 ---- src/main.rs | 4 --- tailwind.css | 1 - 7 files changed, 24 insertions(+), 74 deletions(-) delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 tailwind.css diff --git a/.gitignore b/.gitignore index 1102c98..58e98cf 100644 --- a/.gitignore +++ b/.gitignore @@ -9,8 +9,5 @@ # Dioxus build output /dist -# Node (tailwind toolchain) -node_modules/ - # IDE /.idea diff --git a/README.md b/README.md index 321bbb9..167dc80 100644 --- a/README.md +++ b/README.md @@ -1,51 +1,32 @@ -# Development +# DioNotes Client -Your new bare-bones project includes minimal organization with a single `main.rs` file and a few assets. +Lokale Markdown-Notizen-App auf Basis von [Dioxus 0.7](https://dioxuslabs.com/learn/0.7), Desktop. -``` -project/ -├─ assets/ # Any assets that are used by the app should be placed here -├─ src/ -│ ├─ main.rs # main.rs is the entry point to your application and currently contains all components for the app -├─ Cargo.toml # The Cargo.toml file defines the dependencies and feature flags for your project -``` - -### Automatic Tailwind (Dioxus 0.7+) - -As of Dioxus 0.7, there no longer is a need to manually install tailwind. Simply `dx serve` and you're good to go! - -Automatic tailwind is supported by checking for a file called `tailwind.css` in your app's manifest directory (next to Cargo.toml). To customize the file, use the dioxus.toml: - -```toml -[application] -tailwind_input = "my.css" -tailwind_output = "assets/out.css" # also customize the location of the out file! -``` - -### Tailwind Manual Install - -To use tailwind plugins or manually customize tailwind, you can can install the Tailwind CLI and use it directly. - -### Tailwind -1. Install npm: https://docs.npmjs.com/downloading-and-installing-node-js-and-npm -2. Install the Tailwind CSS CLI: https://tailwindcss.com/docs/installation/tailwind-cli -3. Run the following command in the root of the project to start the Tailwind CSS compiler: +## Entwicklung ```bash -npx @tailwindcss/cli -i ./input.css -o ./assets/tailwind.css --watch +dx serve # Desktop-App starten (Standard-Plattform) +dx serve --platform web # im Browser +cargo test # Tests ``` -### Serving Your App +## Aufbau -Run the following command in the root of your project to start developing with the default platform: - -```bash -dx serve +``` +assets/css/ Design-System: tokens → base → layout → components, + in dieser Reihenfolge in main.rs verlinkt +src/route.rs alle Routen in einem Routable-Enum +src/workspace.rs +src/components/ wiederverwendbare Bausteine (CustomLink, CustomButton, …) +src/views/ die Bildschirme: Selector und Editor +docs/ Konventionen für Agenten, Rechercheergebnisse ``` -To run for a different platform, use the `--platform platform` flag. E.g. -```bash -dx serve --platform desktop -``` +Es gibt **kein** Tailwind und keine npm-Toolchain — das Styling liegt vollständig in +`assets/css/` und arbeitet mit den `--dn-*`-Tokens. +## Wo die Entscheidungen liegen +Fachbegriffe stehen in [`CONTEXT.md`](CONTEXT.md). Entscheidungen werden im +Issue-Tracker geführt statt in `docs/adr/`; eine Wayfinder-Map indexiert pro Vorhaben, +welche Entscheidung wo begründet ist. Siehe [`docs/agents/`](docs/agents/). diff --git a/assets/css/tokens.css b/assets/css/tokens.css index 5bd305e..c6aee55 100644 --- a/assets/css/tokens.css +++ b/assets/css/tokens.css @@ -4,9 +4,9 @@ Palette: Catppuccin Mocha, matching the editor's Theme::CATPPUCCIN_MOCHA so the editor pane and the app chrome are the same surface. - All tokens are prefixed --dn-. Tailwind v4 publishes its own --font-*, - --text-*, --radius-* and --leading-* on :root and tree-shakes that set as - utilities come and go, so an unprefixed token would collide silently. + All tokens are prefixed --dn- to keep them in one namespace. The prefix was + originally defence against Tailwind v4, which publishes its own --font-*, + --text-* and --radius-* on :root; Tailwind is gone, the convention stays. ========================================================================== */ :root { diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 3bab248..0000000 --- a/package-lock.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "dionotes-client", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "tailwindcss": "^4.3.3" - } - }, - "node_modules/tailwindcss": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", - "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", - "license": "MIT" - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 8c765ec..0000000 --- a/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dependencies": { - "tailwindcss": "^4.3.3" - } -} diff --git a/src/main.rs b/src/main.rs index 7e18e53..a071f46 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,7 +13,6 @@ const FAVICON: Asset = asset!("/assets/favicon.ico"); // Linked individually rather than via @import in a single entry file: asset!() // only emits files it is given by name, so an @import chain would 404 at runtime. // Order matters — tokens, then baseline, then layout, then components. -const TAILWIND_CSS: Asset = asset!("/assets/tailwind.css"); const TOKENS_CSS: Asset = asset!("/assets/css/tokens.css"); const BASE_CSS: Asset = asset!("/assets/css/base.css"); const LAYOUT_CSS: Asset = asset!("/assets/css/layout.css"); @@ -32,9 +31,6 @@ fn App() -> Element { rsx! { document::Link { rel: "icon", href: FAVICON } - // Tailwind first: its preflight lives in @layer base, our unlayered - // rules win the cascade regardless, but this keeps source order honest. - document::Link { rel: "stylesheet", href: TAILWIND_CSS } document::Link { rel: "stylesheet", href: TOKENS_CSS } document::Link { rel: "stylesheet", href: BASE_CSS } document::Link { rel: "stylesheet", href: LAYOUT_CSS } diff --git a/tailwind.css b/tailwind.css deleted file mode 100644 index f1d8c73..0000000 --- a/tailwind.css +++ /dev/null @@ -1 +0,0 @@ -@import "tailwindcss"; From ea902b9d7e2b7a5a54491301dbb619e5ba2f37bf Mon Sep 17 00:00:00 2001 From: MDietermann Date: Fri, 28 Aug 2026 09:21:02 +0200 Subject: [PATCH 2/2] chore: generierte assets/tailwind.css aus dem Repo nehmen Nachtrag zum Tailwind-Rauswurf: dx legt die Datei bei jedem vollen Build neu an - auch nachdem die Eingabedatei geloescht wurde und main.rs sie nicht mehr verlinkt. Offenbar aus einem eigenen Cache; ein Schalter dagegen war nicht zu finden. Statt dagegen anzukaempfen wandert sie in die .gitignore. Sie ist ein lokales Nebenprodukt ohne Leser, und so taucht sie nicht bei jedem Build als vermeintliche Aenderung auf. --- .gitignore | 4 + assets/tailwind.css | 275 -------------------------------------------- 2 files changed, 4 insertions(+), 275 deletions(-) delete mode 100644 assets/tailwind.css diff --git a/.gitignore b/.gitignore index 58e98cf..af67aa9 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,7 @@ # IDE /.idea + +# dx erzeugt diese Datei bei jedem vollen Build neu, auch ohne Eingabedatei +# und ohne dass sie noch verlinkt waere. Lokales Nebenprodukt, kein Quellcode. +assets/tailwind.css diff --git a/assets/tailwind.css b/assets/tailwind.css deleted file mode 100644 index 5651d50..0000000 --- a/assets/tailwind.css +++ /dev/null @@ -1,275 +0,0 @@ -/*! tailwindcss v4.1.5 | MIT License | https://tailwindcss.com */ -@layer properties; -@layer theme, base, components, utilities; -@layer theme { - :root, :host { - --font-sans: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', - 'Noto Color Emoji'; - --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', - monospace; - --text-xs: 0.75rem; - --text-sm: 0.875rem; - --text-base: 1rem; - --text-lg: 1.125rem; - --text-xl: 1.25rem; - --leading-tight: 1.25; - --leading-normal: 1.5; - --radius-sm: 0.25rem; - --radius-lg: 0.5rem; - --default-transition-duration: 150ms; - --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - --default-font-family: var(--font-sans); - --default-mono-font-family: var(--font-mono); - } -} -@layer base { - *, ::after, ::before, ::backdrop, ::file-selector-button { - box-sizing: border-box; - margin: 0; - padding: 0; - border: 0 solid; - } - html, :host { - line-height: 1.5; - -webkit-text-size-adjust: 100%; - tab-size: 4; - font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'); - font-feature-settings: var(--default-font-feature-settings, normal); - font-variation-settings: var(--default-font-variation-settings, normal); - -webkit-tap-highlight-color: transparent; - } - hr { - height: 0; - color: inherit; - border-top-width: 1px; - } - abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - } - h1, h2, h3, h4, h5, h6 { - font-size: inherit; - font-weight: inherit; - } - a { - color: inherit; - -webkit-text-decoration: inherit; - text-decoration: inherit; - } - b, strong { - font-weight: bolder; - } - code, kbd, samp, pre { - font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace); - font-feature-settings: var(--default-mono-font-feature-settings, normal); - font-variation-settings: var(--default-mono-font-variation-settings, normal); - font-size: 1em; - } - small { - font-size: 80%; - } - sub, sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; - } - sub { - bottom: -0.25em; - } - sup { - top: -0.5em; - } - table { - text-indent: 0; - border-color: inherit; - border-collapse: collapse; - } - :-moz-focusring { - outline: auto; - } - progress { - vertical-align: baseline; - } - summary { - display: list-item; - } - ol, ul, menu { - list-style: none; - } - img, svg, video, canvas, audio, iframe, embed, object { - display: block; - vertical-align: middle; - } - img, video { - max-width: 100%; - height: auto; - } - button, input, select, optgroup, textarea, ::file-selector-button { - font: inherit; - font-feature-settings: inherit; - font-variation-settings: inherit; - letter-spacing: inherit; - color: inherit; - border-radius: 0; - background-color: transparent; - opacity: 1; - } - :where(select:is([multiple], [size])) optgroup { - font-weight: bolder; - } - :where(select:is([multiple], [size])) optgroup option { - padding-inline-start: 20px; - } - ::file-selector-button { - margin-inline-end: 4px; - } - ::placeholder { - opacity: 1; - } - @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) { - ::placeholder { - color: currentcolor; - @supports (color: color-mix(in lab, red, red)) { - color: color-mix(in oklab, currentcolor 50%, transparent); - } - } - } - textarea { - resize: vertical; - } - ::-webkit-search-decoration { - -webkit-appearance: none; - } - ::-webkit-date-and-time-value { - min-height: 1lh; - text-align: inherit; - } - ::-webkit-datetime-edit { - display: inline-flex; - } - ::-webkit-datetime-edit-fields-wrapper { - padding: 0; - } - ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field { - padding-block: 0; - } - :-moz-ui-invalid { - box-shadow: none; - } - button, input:where([type='button'], [type='reset'], [type='submit']), ::file-selector-button { - appearance: button; - } - ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { - height: auto; - } - [hidden]:where(:not([hidden='until-found'])) { - display: none !important; - } -} -@layer utilities { - .visible { - visibility: visible; - } - .relative { - position: relative; - } - .static { - position: static; - } - .container { - width: 100%; - @media (width >= 40rem) { - max-width: 40rem; - } - @media (width >= 48rem) { - max-width: 48rem; - } - @media (width >= 64rem) { - max-width: 64rem; - } - @media (width >= 80rem) { - max-width: 80rem; - } - @media (width >= 96rem) { - max-width: 96rem; - } - } - .flex { - display: flex; - } - .table { - display: table; - } - .border-collapse { - border-collapse: collapse; - } - .transform { - transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,); - } - .resize { - resize: both; - } - .border { - border-style: var(--tw-border-style); - border-width: 1px; - } - .text-wrap { - text-wrap: wrap; - } - .underline { - text-decoration-line: underline; - } - .outline { - outline-style: var(--tw-outline-style); - outline-width: 1px; - } - .transition { - transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, visibility, content-visibility, overlay, pointer-events; - transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); - transition-duration: var(--tw-duration, var(--default-transition-duration)); - } -} -@property --tw-rotate-x { - syntax: "*"; - inherits: false; -} -@property --tw-rotate-y { - syntax: "*"; - inherits: false; -} -@property --tw-rotate-z { - syntax: "*"; - inherits: false; -} -@property --tw-skew-x { - syntax: "*"; - inherits: false; -} -@property --tw-skew-y { - syntax: "*"; - inherits: false; -} -@property --tw-border-style { - syntax: "*"; - inherits: false; - initial-value: solid; -} -@property --tw-outline-style { - syntax: "*"; - inherits: false; - initial-value: solid; -} -@layer properties { - @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) { - *, ::before, ::after, ::backdrop { - --tw-rotate-x: initial; - --tw-rotate-y: initial; - --tw-rotate-z: initial; - --tw-skew-x: initial; - --tw-skew-y: initial; - --tw-border-style: solid; - --tw-outline-style: solid; - } - } -}