diff --git a/.gitignore b/.gitignore index 1102c98..af67aa9 100644 --- a/.gitignore +++ b/.gitignore @@ -9,8 +9,9 @@ # Dioxus build output /dist -# Node (tailwind toolchain) -node_modules/ - # 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/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/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; - } - } -} diff --git a/docs/agents/issue-tracker.md b/docs/agents/issue-tracker.md index 7420ba4..c809bdb 100644 --- a/docs/agents/issue-tracker.md +++ b/docs/agents/issue-tracker.md @@ -61,6 +61,27 @@ Create a Gitea issue. Run `tea issues ` plus `tea comments ls `. +## Branch- und PR-Workflow + +Änderungen werden **nicht direkt auf `main`** committet, sondern auf einem eigenen Branch +pro logischer Einheit — `feat/`, `fix/`, `refactor/`, `chore/`, `docs/`. Eine Einheit ist, +was man in einem Satz begründen kann; wenn die Commit-Nachricht „und außerdem" braucht, +sind es zwei Branches. + +Zurück nach `main` geht es über einen **Pull Request in Gitea**, nicht per lokalem Merge: + +```bash +git push -u origin +tea pulls create --title "..." --description "..." +``` + +`--description` nimmt wie bei Issues nur eine Zeichenkette; für längere Texte eine Datei +schreiben und mit `$(cat datei)` übergeben. Bezieht sich der PR auf ein Ticket, gehört +`Closes #` in die Beschreibung, damit Gitea es beim Mergen schließt. + +Gemergt wird in der Weboberfläche — das Mergen ist eine Entscheidung des Menschen, nicht +Teil der Umsetzung. + ## Wayfinding operations Used by `/wayfinder`. The **map** is a single issue with **child** issues as tickets. 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 6091a69..fbaaca1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,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"); @@ -34,9 +33,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";