UNPKG

skills-ws

Version:

87 agent skills for AI coding assistants — marketing, growth, web3, dev, design & operations. Built for OpenClaw, Claude Code, Cursor, and Codex.

192 lines (162 loc) • 5.34 kB
## Contents - 9. Telegram Theme CSS Variables <a name="theme-css-variables"></a> - Available Variables - Base CSS Setup - Tailwind CSS Integration ## 9. Telegram Theme CSS Variables <a name="theme-css-variables"></a> Your app should match the user's Telegram theme. **Always use CSS variables instead of hardcoding colors.** With `@telegram-apps/sdk` v3, calling `themeParams.bindCssVars()` (done in the provider in §2) injects the `--tg-theme-*` variables below and keeps them updated when the user switches light/dark — you do **not** need to read each color manually. (The raw `telegram-web-app.js` script also injects a similar set; bindCssVars normalizes naming across SDK versions.) `viewport.bindCssVars()` likewise injects `--tg-viewport-*` and the safe-area insets. ### Available Variables ```css /* Core colors */ --tg-theme-bg-color /* Main background */ --tg-theme-text-color /* Primary text */ --tg-theme-hint-color /* Secondary/hint text */ --tg-theme-link-color /* Links */ --tg-theme-button-color /* Primary button background */ --tg-theme-button-text-color /* Primary button text */ /* Extended palette (Telegram 7.0+) */ --tg-theme-secondary-bg-color /* Secondary background (cards, sections) */ --tg-theme-header-bg-color /* Header background */ --tg-theme-accent-text-color /* Accent text */ --tg-theme-section-bg-color /* Section/card background */ --tg-theme-section-header-text-color /* Section headers */ --tg-theme-subtitle-text-color /* Subtitles */ --tg-theme-destructive-text-color /* Destructive/danger actions */ /* Viewport */ --tg-viewport-height /* Visible viewport height */ --tg-viewport-stable-height /* Stable height (excludes keyboard) */ ``` ### Base CSS Setup ```css /* src/app/globals.css */ :root { /* Fallbacks for development outside Telegram */ --tg-theme-bg-color: #ffffff; --tg-theme-text-color: #000000; --tg-theme-hint-color: #999999; --tg-theme-link-color: #2481cc; --tg-theme-button-color: #5288c1; --tg-theme-button-text-color: #ffffff; --tg-theme-secondary-bg-color: #f0f0f0; --tg-theme-header-bg-color: #ffffff; --tg-theme-accent-text-color: #2481cc; --tg-theme-section-bg-color: #ffffff; --tg-theme-section-header-text-color: #2481cc; --tg-theme-subtitle-text-color: #999999; --tg-theme-destructive-text-color: #cc2424; } * { box-sizing: border-box; margin: 0; padding: 0; } html, body { height: 100%; overflow: hidden; /* Mini App manages its own scroll */ } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; background-color: var(--tg-theme-bg-color); color: var(--tg-theme-text-color); -webkit-font-smoothing: antialiased; /* Prevent text selection in app-like UI */ -webkit-user-select: none; user-select: none; } /* Allow text selection in content areas */ .selectable { -webkit-user-select: text; user-select: text; } /* Scrollable content area */ .content { height: var(--tg-viewport-stable-height, 100vh); overflow-y: auto; -webkit-overflow-scrolling: touch; } /* Component examples */ .card { background: var(--tg-theme-section-bg-color); border-radius: 12px; padding: 16px; margin: 8px 16px; } .card-title { color: var(--tg-theme-section-header-text-color); font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 8px; } .hint { color: var(--tg-theme-hint-color); font-size: 13px; } .button-primary { background: var(--tg-theme-button-color); color: var(--tg-theme-button-text-color); border: none; border-radius: 10px; padding: 12px 24px; font-size: 16px; font-weight: 600; cursor: pointer; width: 100%; transition: opacity 0.2s; } .button-primary:active { opacity: 0.7; } .button-destructive { background: transparent; color: var(--tg-theme-destructive-text-color); border: none; font-size: 16px; cursor: pointer; } .divider { height: 1px; background: var(--tg-theme-hint-color); opacity: 0.2; margin: 0 16px; } a { color: var(--tg-theme-link-color); text-decoration: none; } ``` ### Tailwind CSS Integration ```ts // tailwind.config.ts import type { Config } from "tailwindcss"; const config: Config = { content: ["./src/**/*.{js,ts,jsx,tsx,mdx}"], theme: { extend: { colors: { tg: { bg: "var(--tg-theme-bg-color)", text: "var(--tg-theme-text-color)", hint: "var(--tg-theme-hint-color)", link: "var(--tg-theme-link-color)", button: "var(--tg-theme-button-color)", "button-text": "var(--tg-theme-button-text-color)", "secondary-bg": "var(--tg-theme-secondary-bg-color)", "header-bg": "var(--tg-theme-header-bg-color)", accent: "var(--tg-theme-accent-text-color)", "section-bg": "var(--tg-theme-section-bg-color)", "section-header": "var(--tg-theme-section-header-text-color)", subtitle: "var(--tg-theme-subtitle-text-color)", destructive: "var(--tg-theme-destructive-text-color)", }, }, }, }, plugins: [], }; export default config; ``` Usage: `<div className="bg-tg-bg text-tg-text">` — adapts automatically to user theme. ---