From aafce51c9c58e0e54475fd1a59a045bf368db419 Mon Sep 17 00:00:00 2001 From: Adilson Bortoloso Date: Sat, 2 May 2026 22:01:34 -0300 Subject: [PATCH 1/2] feat(site): add MkDocs Material site with GitHub Pages workflow and local dev scripts - scaffold site structure in docs/ with 7 pages (index, overview, coverage, installation, roadmap, changelog, disclaimer) - add custom CSS with hero layout, card grid, dark/light palette toggle - add GitHub Pages deploy workflow (.github/workflows/pages.yml) - add local dev scripts (serve-docs.sh, build-docs.sh, test-docs.sh) and requirements-docs.txt - exclude site artifacts and venv from VSIX packaging and git - add npm scripts for docs: docs:serve, docs:build, docs:test - add extension marketplace metadata: icon, gallery banner, keywords - add CI workflow for grammar validation (.github/workflows/ci.yml) - bump version to 1.2.0 and add CHANGELOG entries --- .github/workflows/pages.yml | 53 +++++++++++ .gitignore | 3 + .vscodeignore | 6 ++ docs/changelog.md | 24 +++++ docs/coverage.md | 75 ++++++++++++++++ docs/disclaimer.md | 17 ++++ docs/index.md | 66 ++++++++++++++ docs/installation.md | 74 +++++++++++++++ docs/overview.md | 54 +++++++++++ docs/roadmap.md | 35 ++++++++ docs/stylesheets/extra.css | 173 ++++++++++++++++++++++++++++++++++++ mkdocs.yml | 80 +++++++++++++++++ package.json | 3 + requirements-docs.txt | 2 + scripts/build-docs.sh | 14 +++ scripts/serve-docs.sh | 14 +++ scripts/test-docs.sh | 11 +++ 17 files changed, 704 insertions(+) create mode 100644 .github/workflows/pages.yml create mode 100644 docs/changelog.md create mode 100644 docs/coverage.md create mode 100644 docs/disclaimer.md create mode 100644 docs/index.md create mode 100644 docs/installation.md create mode 100644 docs/overview.md create mode 100644 docs/roadmap.md create mode 100644 docs/stylesheets/extra.css create mode 100644 mkdocs.yml create mode 100644 requirements-docs.txt create mode 100755 scripts/build-docs.sh create mode 100755 scripts/serve-docs.sh create mode 100755 scripts/test-docs.sh diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..5f39301 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,53 @@ +name: Deploy Docs + +on: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install docs dependencies + run: pip install -r requirements-docs.txt + + - name: Build site + run: mkdocs build --strict + + - name: Configure Pages + uses: actions/configure-pages@v5 + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: site + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 702afd0..92904ac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ *.vsix assets/ node_modules/ +site/ +.venv-docs/ +.cache/ diff --git a/.vscodeignore b/.vscodeignore index f7466b5..3d5e9c4 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -3,3 +3,9 @@ assets/** .gitignore *.vsix .github/** +docs/** +mkdocs.yml +requirements-docs.txt +scripts/** +site/** +.venv-docs/** diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 0000000..3329a24 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,24 @@ +# Changelog + +A short release overview is maintained here for site visitors. + +## 1.2.0 + +- added Marketplace-oriented metadata +- introduced icon, banner settings, and release scripts +- added changelog and CI workflow +- improved README and repository presentation + +## 1.1.0 + +- optimized grammar performance +- standardized function scopes for better theme compatibility +- prepared repository metadata for publishing + +## 1.0.0 + +- first standalone release of the PL/SQL syntax extension +- custom language id and grammar structure +- MIT licensing and initial documentation + +For the full project history, see the repository changelog. diff --git a/docs/coverage.md b/docs/coverage.md new file mode 100644 index 0000000..354a344 --- /dev/null +++ b/docs/coverage.md @@ -0,0 +1,75 @@ +# Coverage + +## Supported syntax areas + +The current grammar covers the main structures expected in day-to-day PL/SQL work. + +### PL/SQL structures + +- anonymous blocks +- procedures +- functions +- packages and package bodies +- triggers +- types and type bodies +- records, collections, and `%TYPE` / `%ROWTYPE` +- exception handling and control flow + +### SQL syntax + +- DML: `SELECT`, `INSERT`, `UPDATE`, `DELETE`, `MERGE` +- DDL: `CREATE`, `ALTER`, `DROP`, constraints, storage clauses +- joins, ordering, grouping, predicates, and common modifiers + +### Literals and expressions + +- single-quoted strings +- q-quote strings +- national character strings +- numeric literals +- bind variables and substitution variables + +### Built-ins and runtime concepts + +- built-in functions grouped by category +- predefined exceptions +- SQL*Plus commands +- common pseudocolumns and constants + +## Supported file extensions + +The extension currently registers these extensions with the `plsql` language id: + +```text +.sql .pls .plsql .pks .pkb .plb +.fnc .prc .trg .vw .pkg .pck +.seq .job .src .act .bac .bas +.scr .ut +``` + +## Validation assets + +The repository contains validation examples under `assets/examples` covering: + +- schema objects +- packages and package bodies +- standalone functions and procedures +- triggers +- views +- anonymous blocks + +These files are used as manual test material while refining highlighting behavior. + +## Theme compatibility + +The grammar favors broad compatibility by using scope families that themes commonly style: + +- `comment.*` +- `string.*` +- `constant.*` +- `storage.type.*` +- `keyword.*` +- `entity.name.function.*` +- `variable.other.*` + +This improves the chance that tokens receive meaningful colors even in themes with limited custom scope rules. diff --git a/docs/disclaimer.md b/docs/disclaimer.md new file mode 100644 index 0000000..f7abf3d --- /dev/null +++ b/docs/disclaimer.md @@ -0,0 +1,17 @@ +# Disclaimer + +This project is an independent Visual Studio Code extension. + +It is not affiliated with, endorsed by, or related to Oracle Corporation. + +"Oracle", "PL/SQL", and "SQL*Plus" are trademarks or registered trademarks of Oracle Corporation. These names are used only to identify the language and tooling concepts supported by the extension. + +## License + +This project is released under the MIT License. + +## Repository scope + +The public repository contains the extension source, documentation, site configuration, and release-related files required to build and publish the project. + +Generated site output is intentionally excluded from version control. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..34fbb03 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,66 @@ +# PL/SQL for VS Code + +
+
+

Syntax highlighting extension

+

Practical PL/SQL highlighting for real database code.

+

A focused Visual Studio Code extension for PL/SQL, SQL, packages, triggers, procedures, functions, and SQL*Plus scripts. Lightweight, theme-friendly, and built to stay easy to maintain.

+ +

Current status: production-ready for manual installation, with Marketplace publication planned next.

+
+
+ +```text +Language ID: plsql +Scope name : source.plsql +Theme mode : light + dark +Install : VSIX (for now) +Focus : syntax quality and maintainability +``` + +
+
+ +## Why this extension exists + +This project provides a dedicated PL/SQL highlighting experience for VS Code without bundling unnecessary extension features. It is designed for people who work with database code daily and want a grammar that stays organized, fast, and predictable. + +
+ +- ### Lightweight by design + + The extension focuses on syntax highlighting and language registration only. No extra runtime features, no unnecessary payload. + +- ### Theme-compatible scopes + + The grammar uses broadly supported scope families such as `entity.name.function.*`, `keyword.*`, and `storage.type.*` for better compatibility across popular themes. + +- ### Ready for real PL/SQL files + + Common file types like `.sql`, `.pls`, `.pks`, `.pkb`, `.fnc`, `.prc`, `.trg`, and SQL*Plus-style scripts are already mapped. + +- ### Easy to maintain + + The grammar, docs, validation scripts, and release workflow are organized to keep future changes simple. + +
+ +## Current release snapshot + +| Item | Value | +| --- | --- | +| Extension name | PL/SQL | +| Current site branch | `site` | +| Current extension version | `1.2.0` | +| Install method | Manual VSIX installation | +| Next milestone | Marketplace publication | + +## What you can do next + +1. Read the [overview](overview.md) to understand the project status and goals. +2. Follow the [installation guide](installation.md) to build and install locally. +3. Review [coverage](coverage.md) for supported syntax areas and file extensions. +4. Use the [roadmap](roadmap.md) page to keep upcoming work visible. diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000..10cd07f --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,74 @@ +# Installation + +## Current installation method + +The extension is not published to the Marketplace yet, so installation is currently manual via VSIX. + +## Build locally + +From the repository root: + +```bash +npm run validate:grammar +npm run package +``` + +This generates a file like: + +```text +vscode-plsql-syntax-1.2.0.vsix +``` + +## Install in VS Code + +```bash +code --install-extension vscode-plsql-syntax-1.2.0.vsix --force +``` + +Then reload the window: + +```text +Developer: Reload Window +``` + +## Validate highlighting + +Open one or more example files from `assets/examples` and inspect tokens if needed with: + +```text +Developer: Inspect Editor Tokens and Scopes +``` + +## Local site preview + +The documentation site can also be tested locally before publishing. + +### Start preview server + +```bash +./scripts/serve-docs.sh +``` + +Then open: + +```text +http://127.0.0.1:8000 +``` + +### Build static site + +```bash +./scripts/build-docs.sh +``` + +### Run a simple offline validation + +```bash +./scripts/test-docs.sh +``` + +## Notes + +- Generated site files go to `site/` and are ignored by Git. +- The local Python environment is stored in `.venv-docs/` and is also ignored. +- Marketplace publication can be added later without changing the documentation structure. diff --git a/docs/overview.md b/docs/overview.md new file mode 100644 index 0000000..aae0bc8 --- /dev/null +++ b/docs/overview.md @@ -0,0 +1,54 @@ +# Purpose and Status + +## Purpose + +The PL/SQL extension exists to provide a focused and maintainable syntax highlighting experience for database-oriented development in Visual Studio Code. + +The goal is straightforward: + +- highlight real PL/SQL and SQL code accurately +- support common file naming conventions used in database projects +- stay lightweight and fast +- remain easy to evolve and publish + +## Current status + +The extension is currently ready for manual installation and local use. + +It already includes: + +- a standalone language id: `plsql` +- a custom grammar in `syntaxes/plsql.tmLanguage.json` +- a language configuration in `syntaxes/language-configuration.json` +- local packaging with `vsce` +- repository metadata, changelog, and CI +- this site and documentation structure + +## What is planned next + +The next step is Marketplace publication. + +That work mainly involves: + +- final review of metadata and visuals +- screenshots for Marketplace presentation +- release tagging and publication flow +- ongoing grammar refinements based on real usage + +## Project principles + +### 1. Keep scope intentional + +The extension should stay focused on syntax highlighting and file association. This keeps behavior predictable and reduces maintenance cost. + +### 2. Prefer clarity over size + +The grammar is optimized, but not at the cost of becoming opaque. It should remain understandable when future fixes are needed. + +### 3. Stay theme-friendly + +Scope names are chosen to work well with common VS Code themes in both dark and light mode. + +### 4. Make release operations repeatable + +Packaging, validation, documentation, and site generation should all be easy to run locally before publishing. diff --git a/docs/roadmap.md b/docs/roadmap.md new file mode 100644 index 0000000..ad9c0e3 --- /dev/null +++ b/docs/roadmap.md @@ -0,0 +1,35 @@ +# Roadmap + +## Near-term goals + +### Marketplace publication + +- finalize listing metadata +- prepare screenshots +- publish first official release + +### Grammar refinement + +- expand coverage based on real-world PL/SQL files +- reduce false positives where generic SQL terms overlap with identifiers +- keep performance stable on larger files + +### Documentation quality + +- add screenshots of light and dark themes +- document typical development workflows +- add release notes as versions evolve + +## Ongoing maintenance + +- validate grammar changes before release +- keep CI green for packaging and site generation +- review theme behavior periodically +- keep the site aligned with the current release state + +## Long-term possibilities + +- Marketplace badges and install stats on the site +- dedicated screenshots and comparison pages +- more formal grammar regression testing +- additional tooling only if it stays aligned with the lightweight scope of the extension diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 0000000..36112d4 --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,173 @@ +:root { + --plsql-accent: #f59e0b; + --plsql-accent-strong: #d97706; + --plsql-surface: rgba(255, 255, 255, 0.72); + --plsql-shadow: 0 24px 80px rgba(15, 23, 42, 0.12); +} + +[data-md-color-scheme="slate"] { + --plsql-surface: rgba(15, 23, 42, 0.58); + --plsql-shadow: 0 24px 80px rgba(2, 6, 23, 0.4); +} + +.md-main { + background: + radial-gradient(circle at top right, rgba(245, 158, 11, 0.16), transparent 30%), + radial-gradient(circle at top left, rgba(59, 130, 246, 0.10), transparent 35%); +} + +.md-grid { + max-width: 78rem; +} + +.md-content__inner { + margin: 0 auto; +} + +.hero { + display: grid; + grid-template-columns: minmax(0, 1.45fr) minmax(320px, 0.85fr); + gap: 2rem; + padding: 1.25rem 0 2.5rem; + align-items: center; +} + +.eyebrow { + display: inline-flex; + padding: 0.3rem 0.7rem; + border-radius: 999px; + font-size: 0.72rem; + letter-spacing: 0.08em; + text-transform: uppercase; + font-weight: 700; + color: var(--plsql-accent-strong); + background: rgba(245, 158, 11, 0.14); +} + +.hero h1 { + margin: 0.4rem 0 0.8rem; + font-size: clamp(2.4rem, 5vw, 4rem); + line-height: 1.02; +} + +.hero-copy { + font-size: 1.08rem; + max-width: 46rem; + opacity: 0.9; +} + +.hero-actions { + display: flex; + gap: 0.8rem; + margin: 1.2rem 0 0.8rem; + flex-wrap: wrap; +} + +.hero-note { + margin: 0; + font-size: 0.92rem; + opacity: 0.78; +} + +.hero-panel { + border: 1px solid rgba(148, 163, 184, 0.22); + border-radius: 24px; + padding: 1.2rem; + background: linear-gradient(180deg, var(--plsql-surface), rgba(148, 163, 184, 0.08)); + box-shadow: var(--plsql-shadow); + backdrop-filter: blur(14px); +} + +.hero-panel pre { + margin: 0; + background: transparent; + border: 0; +} + +.card-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(21rem, 1fr)); + gap: 1.25rem; + margin-top: 1.2rem; +} + +.card-grid > ul { + display: contents; +} + +.card-grid li { + list-style: none; + margin: 0; + min-height: 100%; + padding: 1.35rem 1.35rem 1.15rem; + border-radius: 20px; + background: linear-gradient(180deg, var(--plsql-surface), rgba(148, 163, 184, 0.08)); + border: 1px solid rgba(148, 163, 184, 0.18); + box-shadow: var(--plsql-shadow); +} + +.card-grid h3 { + margin-top: 0; + margin-bottom: 0.7rem; +} + +.card-grid li p { + margin-top: 0; + margin-bottom: 0; +} + +.md-typeset .md-button--primary { + background-color: var(--plsql-accent); + border-color: var(--plsql-accent); + color: #111827; +} + +.md-typeset .md-button--primary:hover { + background-color: var(--plsql-accent-strong); + border-color: var(--plsql-accent-strong); + color: #fff; +} + +@media (max-width: 1100px) { + .hero { + grid-template-columns: 1fr; + } +} + +@media (max-width: 960px) { + .hero { + grid-template-columns: 1fr; + } + + .card-grid { + grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr)); + } +} + +@media (max-width: 640px) { + .md-content__inner { + margin: 0; + } + + .hero { + gap: 1.25rem; + padding: 0.75rem 0 1.75rem; + } + + .hero h1 { + font-size: clamp(2rem, 10vw, 2.8rem); + } + + .hero-panel { + padding: 1rem; + } + + .card-grid { + grid-template-columns: 1fr; + gap: 1rem; + } + + .card-grid li { + padding: 1.15rem 1.05rem 1rem; + } +} diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..64d5968 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,80 @@ +site_name: PL/SQL +site_description: PL/SQL syntax highlighting extension for Visual Studio Code. +site_url: https://bortoloso.github.io/vscode-plsql-syntax/ +repo_url: https://github.com/bortoloso/vscode-plsql-syntax +repo_name: bortoloso/vscode-plsql-syntax +edit_uri: edit/main/docs/ +site_dir: site +copyright: Copyright (c) 2026 bortoloso + +theme: + name: material + logo: assets/icon.png + favicon: assets/icon.png + language: en + font: + text: IBM Plex Sans + code: IBM Plex Mono + palette: + - scheme: default + primary: blue grey + accent: amber + toggle: + icon: material/weather-night + name: Switch to dark mode + - scheme: slate + primary: blue grey + accent: amber + toggle: + icon: material/weather-sunny + name: Switch to light mode + features: + - navigation.sections + - navigation.top + - navigation.footer + - navigation.indexes + - content.code.copy + - content.tabs.link + - content.tooltips + - search.highlight + - search.suggest + - toc.follow + +nav: + - Home: index.md + - Overview: + - Purpose and Status: overview.md + - Coverage: coverage.md + - Installation: installation.md + - Roadmap: roadmap.md + - Project: + - Changelog: changelog.md + - Disclaimer: disclaimer.md + +markdown_extensions: + - admonition + - attr_list + - def_list + - footnotes + - md_in_html + - pymdownx.details + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - tables + +extra: + social: + - icon: fontawesome/brands/github + link: https://github.com/bortoloso/vscode-plsql-syntax + name: GitHub repository + +extra_css: + - stylesheets/extra.css + +plugins: + - search diff --git a/package.json b/package.json index 9ab3133..a97759b 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,9 @@ }, "scripts": { "validate:grammar": "node -e \"JSON.parse(require('fs').readFileSync('syntaxes/plsql.tmLanguage.json','utf8')); JSON.parse(require('fs').readFileSync('syntaxes/language-configuration.json','utf8')); console.log('Grammar JSON OK');\"", + "docs:serve": "./scripts/serve-docs.sh", + "docs:build": "./scripts/build-docs.sh", + "docs:test": "./scripts/test-docs.sh", "package": "vsce package", "package:ci": "vsce package --out vscode-plsql-syntax.vsix" }, diff --git a/requirements-docs.txt b/requirements-docs.txt new file mode 100644 index 0000000..948c9be --- /dev/null +++ b/requirements-docs.txt @@ -0,0 +1,2 @@ +mkdocs==1.6.1 +mkdocs-material==9.6.14 diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh new file mode 100755 index 0000000..3325992 --- /dev/null +++ b/scripts/build-docs.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +VENV_DIR="$ROOT_DIR/.venv-docs" + +if [[ ! -d "$VENV_DIR" ]]; then + python3 -m venv "$VENV_DIR" +fi + +source "$VENV_DIR/bin/activate" +pip install --disable-pip-version-check -r "$ROOT_DIR/requirements-docs.txt" >/dev/null +cd "$ROOT_DIR" +mkdocs build --strict diff --git a/scripts/serve-docs.sh b/scripts/serve-docs.sh new file mode 100755 index 0000000..db711b6 --- /dev/null +++ b/scripts/serve-docs.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +VENV_DIR="$ROOT_DIR/.venv-docs" + +if [[ ! -d "$VENV_DIR" ]]; then + python3 -m venv "$VENV_DIR" +fi + +source "$VENV_DIR/bin/activate" +pip install --disable-pip-version-check -r "$ROOT_DIR/requirements-docs.txt" >/dev/null +cd "$ROOT_DIR" +mkdocs serve -a 127.0.0.1:8000 diff --git a/scripts/test-docs.sh b/scripts/test-docs.sh new file mode 100755 index 0000000..e607bd1 --- /dev/null +++ b/scripts/test-docs.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +"$ROOT_DIR/scripts/build-docs.sh" +if [[ -f "$ROOT_DIR/site/index.html" ]]; then + echo "Site build OK" +else + echo "Site build failed: site/index.html not found" >&2 + exit 1 +fi From a4eb2e44bf8f105410ff645a3da0e822baefcaee Mon Sep 17 00:00:00 2001 From: Adilson Bortoloso Date: Sat, 2 May 2026 22:39:15 -0300 Subject: [PATCH 2/2] feat(branding): adopt selected v6 icon across extension and docs - set v6 as canonical icon in media (svg + png) - add site icon assets under docs/assets (svg + png) - update mkdocs branding to use svg icon assets - keep docs assets tracked in gitignore rules - include latest package metadata updates (version 1.2.1) --- .gitignore | 3 + docs/assets/icon.png | Bin 0 -> 9626 bytes docs/assets/icon.svg | 23 ++++ docs/stylesheets/extra.css | 260 ++++++++++++++++++++++++++----------- media/icon.png | Bin 9234 -> 9626 bytes media/icon.svg | 23 ++++ mkdocs.yml | 4 +- package.json | 2 +- 8 files changed, 237 insertions(+), 78 deletions(-) create mode 100644 docs/assets/icon.png create mode 100644 docs/assets/icon.svg create mode 100644 media/icon.svg diff --git a/.gitignore b/.gitignore index 92904ac..3377416 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ *.vsix assets/ +!docs/assets/ +!docs/assets/icon.png +!docs/assets/icon.svg node_modules/ site/ .venv-docs/ diff --git a/docs/assets/icon.png b/docs/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d71604db888fe5bb673b6bfb2bb586a89536768c GIT binary patch literal 9626 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 + + PL + SQL + diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 36112d4..2a9ea18 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -1,94 +1,170 @@ +/* ── Brand tokens ─────────────────────────────────────────── */ :root { - --plsql-accent: #f59e0b; - --plsql-accent-strong: #d97706; - --plsql-surface: rgba(255, 255, 255, 0.72); - --plsql-shadow: 0 24px 80px rgba(15, 23, 42, 0.12); + --pa-amber: #f59e0b; + --pa-amber-dim: #d97706; + --pa-amber-glow: rgba(245, 158, 11, 0.12); + --pa-amber-line: rgba(245, 158, 11, 0.32); + --pa-dark: #0f172a; + --pa-surface: rgba(255, 255, 255, 0.80); + --pa-border: rgba(148, 163, 184, 0.18); + --pa-shadow: 0 4px 16px rgba(15, 23, 42, 0.08), 0 1px 4px rgba(15, 23, 42, 0.05); + --pa-radius: 18px; } [data-md-color-scheme="slate"] { - --plsql-surface: rgba(15, 23, 42, 0.58); - --plsql-shadow: 0 24px 80px rgba(2, 6, 23, 0.4); + --pa-surface: rgba(15, 23, 42, 0.75); + --pa-border: rgba(148, 163, 184, 0.12); + --pa-shadow: 0 4px 16px rgba(2, 6, 23, 0.40), 0 1px 4px rgba(2, 6, 23, 0.20); } +/* ── Page background ──────────────────────────────────────── */ .md-main { background: - radial-gradient(circle at top right, rgba(245, 158, 11, 0.16), transparent 30%), - radial-gradient(circle at top left, rgba(59, 130, 246, 0.10), transparent 35%); + radial-gradient(ellipse 60% 30% at 100% 0%, rgba(245, 158, 11, 0.13) 0%, transparent 55%), + radial-gradient(ellipse 45% 35% at 0% 70%, rgba(59, 130, 246, 0.06) 0%, transparent 60%); } +/* ── Content container ────────────────────────────────────── */ .md-grid { - max-width: 78rem; + max-width: 66rem; } -.md-content__inner { - margin: 0 auto; +/* ── Primary button ───────────────────────────────────────── */ +.md-typeset .md-button--primary { + background-color: var(--pa-amber); + border-color: var(--pa-amber); + color: #111827; + font-weight: 700; + letter-spacing: 0.02em; + box-shadow: 0 2px 10px rgba(245, 158, 11, 0.28); + transition: background 0.18s, box-shadow 0.18s, transform 0.14s; +} + +.md-typeset .md-button--primary:hover { + background-color: var(--pa-amber-dim); + border-color: var(--pa-amber-dim); + color: #fff; + box-shadow: 0 4px 18px rgba(245, 158, 11, 0.40); + transform: translateY(-1px); +} + +.md-typeset .md-button { + transition: transform 0.14s; +} + +.md-typeset .md-button:hover { + transform: translateY(-1px); } +/* ══════════════════════════════════════════════════════════ + HERO + ══════════════════════════════════════════════════════════ */ .hero { display: grid; - grid-template-columns: minmax(0, 1.45fr) minmax(320px, 0.85fr); - gap: 2rem; - padding: 1.25rem 0 2.5rem; + grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr); + gap: 2.5rem; + padding: 2.5rem 0 3rem; align-items: center; } .eyebrow { display: inline-flex; - padding: 0.3rem 0.7rem; + padding: 0.28rem 0.75rem; border-radius: 999px; - font-size: 0.72rem; - letter-spacing: 0.08em; + font-size: 0.69rem; + letter-spacing: 0.10em; text-transform: uppercase; font-weight: 700; - color: var(--plsql-accent-strong); - background: rgba(245, 158, 11, 0.14); + color: var(--pa-amber-dim); + background: var(--pa-amber-glow); + border: 1px solid var(--pa-amber-line); } .hero h1 { - margin: 0.4rem 0 0.8rem; - font-size: clamp(2.4rem, 5vw, 4rem); - line-height: 1.02; + margin: 0.5rem 0 0.9rem; + font-size: clamp(2rem, 4.2vw, 3.2rem); + line-height: 1.08; + letter-spacing: -0.02em; } .hero-copy { - font-size: 1.08rem; - max-width: 46rem; - opacity: 0.9; + font-size: 1.03rem; + line-height: 1.68; + max-width: 42rem; + opacity: 0.88; } .hero-actions { display: flex; - gap: 0.8rem; - margin: 1.2rem 0 0.8rem; + gap: 0.75rem; + margin: 1.4rem 0 1rem; flex-wrap: wrap; } .hero-note { margin: 0; - font-size: 0.92rem; - opacity: 0.78; + font-size: 0.865rem; + opacity: 0.62; } +/* Hero panel — right column */ .hero-panel { - border: 1px solid rgba(148, 163, 184, 0.22); - border-radius: 24px; - padding: 1.2rem; - background: linear-gradient(180deg, var(--plsql-surface), rgba(148, 163, 184, 0.08)); - box-shadow: var(--plsql-shadow); - backdrop-filter: blur(14px); + border: 1px solid var(--pa-border); + border-radius: 22px; + padding: 1.5rem 1.5rem 1.25rem; + background: var(--pa-surface); + box-shadow: var(--pa-shadow), inset 0 1px 0 rgba(255, 255, 255, 0.10); + backdrop-filter: blur(16px); + position: relative; + overflow: hidden; +} + +.hero-panel::before { + content: ''; + position: absolute; + top: 0; left: 0; right: 0; + height: 3px; + background: linear-gradient(90deg, var(--pa-amber), var(--pa-amber-dim)); + border-radius: 22px 22px 0 0; } .hero-panel pre { margin: 0; - background: transparent; - border: 0; + background: transparent !important; + border: 0 !important; + box-shadow: none !important; + font-size: 0.875rem; + line-height: 1.72; +} + +/* ══════════════════════════════════════════════════════════ + SECTION HEADINGS — amber left accent + ══════════════════════════════════════════════════════════ */ +.md-typeset h2 { + display: flex; + align-items: center; + gap: 0.65rem; + margin-top: 3rem; } +.md-typeset h2::before { + content: ''; + display: inline-block; + width: 4px; + height: 1.15em; + border-radius: 2px; + background: var(--pa-amber); + flex-shrink: 0; +} + +/* ══════════════════════════════════════════════════════════ + CARD GRID — fixed 2-col on desktop, 1-col on mobile + ══════════════════════════════════════════════════════════ */ .card-grid { display: grid; - grid-template-columns: repeat(auto-fit, minmax(21rem, 1fr)); - gap: 1.25rem; - margin-top: 1.2rem; + grid-template-columns: repeat(2, 1fr); + gap: 1.1rem; + margin-top: 1.5rem; } .card-grid > ul { @@ -98,76 +174,110 @@ .card-grid li { list-style: none; margin: 0; - min-height: 100%; - padding: 1.35rem 1.35rem 1.15rem; - border-radius: 20px; - background: linear-gradient(180deg, var(--plsql-surface), rgba(148, 163, 184, 0.08)); - border: 1px solid rgba(148, 163, 184, 0.18); - box-shadow: var(--plsql-shadow); + padding: 1.4rem 1.5rem 1.2rem; + border-radius: var(--pa-radius); + background: var(--pa-surface); + border: 1px solid var(--pa-border); + box-shadow: var(--pa-shadow); + transition: transform 0.18s, box-shadow 0.18s; + position: relative; + overflow: hidden; +} + +.card-grid li::after { + content: ''; + position: absolute; + bottom: 0; left: 1.5rem; right: 1.5rem; + height: 2px; + background: linear-gradient(90deg, var(--pa-amber-line), transparent); + border-radius: 2px; +} + +.card-grid li:hover { + transform: translateY(-3px); + box-shadow: var(--pa-shadow), 0 10px 28px rgba(245, 158, 11, 0.10); } .card-grid h3 { margin-top: 0; - margin-bottom: 0.7rem; + margin-bottom: 0.55rem; + font-size: 0.975rem; + font-weight: 700; + letter-spacing: -0.01em; } .card-grid li p { - margin-top: 0; - margin-bottom: 0; + margin: 0; + font-size: 0.875rem; + line-height: 1.62; + opacity: 0.82; } -.md-typeset .md-button--primary { - background-color: var(--plsql-accent); - border-color: var(--plsql-accent); - color: #111827; +/* ══════════════════════════════════════════════════════════ + TABLE + ══════════════════════════════════════════════════════════ */ +.md-typeset table:not([class]) { + border-radius: 14px; + overflow: hidden; + border: 1px solid var(--pa-border); + box-shadow: var(--pa-shadow); + border-collapse: separate; + border-spacing: 0; } -.md-typeset .md-button--primary:hover { - background-color: var(--plsql-accent-strong); - border-color: var(--plsql-accent-strong); - color: #fff; +.md-typeset table:not([class]) th { + background: var(--pa-amber-glow); + color: var(--pa-amber-dim); + font-size: 0.76rem; + letter-spacing: 0.08em; + text-transform: uppercase; + border-bottom: 1px solid var(--pa-amber-line); } -@media (max-width: 1100px) { - .hero { - grid-template-columns: 1fr; - } +.md-typeset table:not([class]) td, +.md-typeset table:not([class]) th { + padding: 0.75rem 1rem; + border: none; +} + +.md-typeset table:not([class]) tr:not(:last-child) td { + border-bottom: 1px solid var(--pa-border); } -@media (max-width: 960px) { +/* ── Responsive ───────────────────────────────────────────── */ +@media (max-width: 1024px) { .hero { grid-template-columns: 1fr; + gap: 2rem; + padding: 2rem 0 2.5rem; } - .card-grid { - grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr)); + .hero-panel { + max-width: 40rem; } } -@media (max-width: 640px) { - .md-content__inner { - margin: 0; - } - +@media (max-width: 680px) { .hero { - gap: 1.25rem; - padding: 0.75rem 0 1.75rem; + gap: 1.5rem; + padding: 1.25rem 0 2rem; } .hero h1 { - font-size: clamp(2rem, 10vw, 2.8rem); + font-size: clamp(1.8rem, 9vw, 2.4rem); } .hero-panel { - padding: 1rem; + max-width: 100%; + padding: 1.25rem; } .card-grid { grid-template-columns: 1fr; - gap: 1rem; + gap: 0.9rem; } .card-grid li { - padding: 1.15rem 1.05rem 1rem; + padding: 1.2rem 1.1rem 1rem; } } diff --git a/media/icon.png b/media/icon.png index 8637c1df71d6173f32a5c8f66416dfb9e4bc18b0..d71604db888fe5bb673b6bfb2bb586a89536768c 100644 GIT binary patch literal 9626 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 + + PL + SQL + diff --git a/mkdocs.yml b/mkdocs.yml index 64d5968..8dfcd44 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -9,8 +9,8 @@ copyright: Copyright (c) 2026 bortoloso theme: name: material - logo: assets/icon.png - favicon: assets/icon.png + logo: assets/icon.svg + favicon: assets/icon.svg language: en font: text: IBM Plex Sans diff --git a/package.json b/package.json index a97759b..b98bc14 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-plsql-syntax", "displayName": "PL/SQL", "description": "PL/SQL syntax highlighting for SQL, procedures, packages, triggers, and SQL*Plus scripts", - "version": "1.2.0", + "version": "1.2.1", "publisher": "bortoloso", "license": "MIT", "icon": "media/icon.png",