๐Ÿฌ Turbo Pascal 7.0 Blue-Screen Skin (DSH Web GUI)

August 14, 2026 ยท View on GitHub

English | ็ฎ€ไฝ“ไธญๆ–‡

Recreates the DeepSeek Harness web GUI in the classic Turbo Pascal 7.0 IDE (1992) look: deep-blue desktop, striped menu bar, menu-style highlights, DOS 3D beveled controls, block caret, and a TP status bar.

skin-preview

Add a screenshot as docs/preview.png (~1280ร—800) to show the actual result in this README.

โœจ Features

AreaEffect
Desktop backgroundClassic TP blue #0000AA, black message surface
Header menu barTP7.0 diagonal-stripe background + gray divider line
chat / trajectory tabsTP7.0 menu-style highlight: selected tab inverse white-on-deep-blue, unselected transparent white, hover deep blue
Breadcrumb navigationTransparent with light text, hover deep blue
Top-left brand logoTransparent menu style, hover deep-blue highlight
Sidebar workspace buttonsSearch / view options / new โ€” all transparent white icons
Plugin config cardsDeep-blue card + white plugin name, readable header
Regular buttons / inputsDOS 3D bevel (raised buttons, recessed inputs, inverted on press)
Caret / selection / focusBright-green block caret, inverse-video selection, yellow focus ring
ScrollbarsSquare gray thumb + deep-blue track
Bottom status barF1 Help | F2 Save | F3 Open | F9 Compile | F10 Menu
TypographySystem sans for legibility (Arial / Segoe UI family), monospace preserved for code

๐Ÿš€ Installation

This is a client-side (browser) plugin only โ€” no Host logic involved. Pick either installation method:

In your DSH session, ask the agent to:

  1. Run cordis_define to create a new plugin with idPrefix set to tpsk;
  2. Pass the full contents of plugin/dynamic.js as code.client (leave code.host empty);
  3. Run cordis_run to activate, approve, then refresh the page.

Dynamic plugins are session-scoped and in-memory; they need to be re-loaded after a restart. Great for a quick try.

Option 2: Fixed plugin (integrate into the DeepSeek Harness repo)

Copy this directory's src/, package.json, tsconfig.json, and tsdown.config.ts into the repo as packages/client/ui-tp7-skin/, then:

  1. Add a row to the browser roster in packages/bundle/web-app/cordis.patch.yml:

    - id: ui-tp7-skin
      name: '@deepseek-ai/dsh-client-ui-tp7-skin'
    
  2. Add the dependency to packages/bundle/web-app/package.json:

    "@deepseek-ai/dsh-client-ui-tp7-skin": "workspace:^"
    
  3. Add the reference in the root tsconfig.client.json:

    { "path": "./packages/client/ui-tp7-skin" }
    
  4. Build and restart:

    pnpm install
    pnpm --filter @deepseek-ai/dsh-client-ui-tp7-skin bundle
    pnpm run build:lib:client
    

    After restarting dsh --profile web, the skin applies automatically and appears under Settings โ†’ Plugins (Plugin list).

๐Ÿ“ Directory Layout

dsh-tp7-skin/
โ”œโ”€โ”€ README.md                 # This document
โ”œโ”€โ”€ LICENSE                   # MIT license
โ”œโ”€โ”€ package.json              # Fixed-plugin package metadata
โ”œโ”€โ”€ tsconfig.json             # TypeScript config (client)
โ”œโ”€โ”€ tsdown.config.ts          # tsdown bundle config
โ”œโ”€โ”€ plugin/
โ”‚   โ””โ”€โ”€ dynamic.js            # Dynamic-plugin edition (single file for cordis_define)
โ””โ”€โ”€ src/
    โ”œโ”€โ”€ css-modules.d.ts      # CSS Modules type declarations
    โ”œโ”€โ”€ index.ts              # Node half (empty apply)
    โ”œโ”€โ”€ invariant.ts          # Invariant companion package
    โ””โ”€โ”€ client/
        โ”œโ”€โ”€ index.ts          # Browser half: token overrides + status-bar registration
        โ””โ”€โ”€ skin.module.css   # Global skin stylesheet (:global rules)

๐Ÿงฉ How It Works

  • Theme token overrides: theme.overrideTokens locks all 13 --dsw-alias-* tokens to the TP7.0 palette (light == dark), so the skin does not follow the OS scheme;
  • Global stylesheet injection: the CSS ships as .module.css; the build pipeline auto-injects a <style data-plugin-css> tag that is removed with the plugin fiber. Every rule is wrapped in :global and targets regions through slot wrappers ([data-slot='...']) instead of hashed class names;
  • Status bar: registered into the conversation.composer.dock slot (list entry tp7-statusbar), rendered with React.createElement.

โš–๏ธ License

MIT ยฉ 2025


Acknowledgements: Design homage to the Borland Turbo Pascal 7.0 IDE (1992) โ€” the blue screen that accompanied a generation of programmers.