Implements Phases 1-8 of the TFTSR implementation plan. Rust backend (Tauri 2.x, src-tauri/): - Multi-provider AI: OpenAI-compatible, Anthropic, Gemini, Mistral, Ollama - PII detection engine: 11 regex patterns with overlap resolution - SQLCipher AES-256 encrypted database with 10 versioned migrations - 28 Tauri IPC commands for triage, analysis, document, and system ops - Ollama: hardware probe, model recommendations, pull/delete with events - RCA and blameless post-mortem Markdown document generators - PDF export via printpdf - Audit log: SHA-256 hash of every external data send - Integration stubs for Confluence, ServiceNow, Azure DevOps (v0.2) Frontend (React 18 + TypeScript + Vite, src/): - 9 pages: full triage workflow NewIssue→LogUpload→Triage→Resolution→RCA→Postmortem→History+Settings - 7 components: ChatWindow, TriageProgress, PiiDiffViewer, DocEditor, HardwareReport, ModelSelector, UI primitives - 3 Zustand stores: session, settings (persisted), history - Type-safe tauriCommands.ts matching Rust backend types exactly - 8 IT domain system prompts (Linux, Windows, Network, K8s, DB, Virt, HW, Obs) DevOps: - .woodpecker/test.yml: rustfmt, clippy, cargo test, tsc, vitest on every push - .woodpecker/release.yml: linux/amd64 + linux/arm64 builds, Gogs release upload Verified: - cargo check: zero errors - tsc --noEmit: zero errors - vitest run: 13/13 unit tests passing Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
86 lines
1.9 KiB
Markdown
86 lines
1.9 KiB
Markdown
# PostCSS Nested
|
||
|
||
<img align="right" width="135" height="95"
|
||
title="Philosopher’s stone, logo of PostCSS"
|
||
src="https://postcss.org/logo-leftp.svg">
|
||
|
||
[PostCSS] plugin to unwrap nested rules closer to Sass syntax.
|
||
|
||
```css
|
||
.phone {
|
||
&_title {
|
||
width: 500px;
|
||
@media (max-width: 500px) {
|
||
width: auto;
|
||
}
|
||
body.is_dark & {
|
||
color: white;
|
||
}
|
||
}
|
||
img {
|
||
display: block;
|
||
}
|
||
}
|
||
|
||
.title {
|
||
font-size: var(--font);
|
||
|
||
@at-root html {
|
||
--font: 16px;
|
||
}
|
||
}
|
||
```
|
||
|
||
will be processed to:
|
||
|
||
```css
|
||
.phone_title {
|
||
width: 500px;
|
||
}
|
||
@media (max-width: 500px) {
|
||
.phone_title {
|
||
width: auto;
|
||
}
|
||
}
|
||
body.is_dark .phone_title {
|
||
color: white;
|
||
}
|
||
.phone img {
|
||
display: block;
|
||
}
|
||
|
||
.title {
|
||
font-size: var(--font);
|
||
}
|
||
html {
|
||
--font: 16px;
|
||
}
|
||
```
|
||
|
||
Related plugins:
|
||
|
||
- Use [`postcss-current-selector`] **after** this plugin if you want
|
||
to use current selector in properties or variables values.
|
||
- Use [`postcss-nested-ancestors`] **before** this plugin if you want
|
||
to reference any ancestor element directly in your selectors with `^&`.
|
||
|
||
Alternatives:
|
||
|
||
- See also [`postcss-nesting`], which implements [CSSWG draft].
|
||
- [`postcss-nested-props`] for nested properties like `font-size`.
|
||
|
||
<a href="https://evilmartians.com/?utm_source=postcss-nested">
|
||
<img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg"
|
||
alt="Sponsored by Evil Martians" width="236" height="54">
|
||
</a>
|
||
|
||
[`postcss-current-selector`]: https://github.com/komlev/postcss-current-selector
|
||
[`postcss-nested-ancestors`]: https://github.com/toomuchdesign/postcss-nested-ancestors
|
||
[`postcss-nested-props`]: https://github.com/jedmao/postcss-nested-props
|
||
[`postcss-nesting`]: https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-nesting
|
||
[CSSWG draft]: https://drafts.csswg.org/css-nesting-1/
|
||
[PostCSS]: https://github.com/postcss/postcss
|
||
|
||
## Docs
|
||
Read full docs **[here](https://github.com/postcss/postcss-nested#readme)**.
|