* fix(web): UI consistency — code tokens, label-qualifier, radio card selected state
I-UI-01: Add .sync-option-card:has(input:checked) rule — border + background
feedback when a radio option card is selected. Add class sync-option-card to
all 14 radio label cards in admin_tables.html.
I-UI-02: Add .label-qualifier / .optional to style-custom.css. Remove the
duplicate local definition from admin_tables.html <style> block.
I-UI-03: Migrate inline code rule to design tokens (--font-mono, --text-sm,
--border-light, --border, --radius-sm). Add background + border so inline
code is visually distinct across all pages.
I-UI-05 (partial): Replace hardcoded #c4c4c4 / #fafafa in .btn-google:hover
with var(--border) / var(--background) so theme overrides apply.
* fix(web): expose entire Keboola edit-modal JS to all instance types
openEditKeboolaModal, closeEditKeboolaModal, saveKeboolaTabEdit,
onEditKbStrategyChange and helpers were still inside {% if keboola %}
but called from always-rendered HTML (openEditModal dispatcher,
Escape key handler, modal overlay click, Cancel/Save buttons).
Removed the Phase F2 if-guard entirely — only prefillFromKeboolaTable
stays conditional (its callers are inside {% if keboola %} HTML blocks).
* fix(ui): promote .form-textarea to global CSS with design tokens
Removes the local hardcoded .form-textarea definition from admin_tables.html
and adds it globally to style-custom.css using design tokens, making
description textareas visually consistent with other form fields.
* fix(ui): restore .form-textarea to local style block for visual consistency
Tokens --text-sm (12px) and --radius-md (6px) differ from the local override
values (13px, 8px) used by .form-input on this page, causing a visible mismatch.
.form-textarea rejoins the shared local selector so all three classes render
identically; global .form-textarea in style-custom.css remains as a baseline
for other pages.
* fix(ui): use textarea.form-textarea in global CSS to override .form-group textarea
.form-group textarea (specificity 0,1,1) was overriding .form-textarea (0,1,0)
with a legacy monospace font and different padding. Raising the selector to
textarea.form-textarea matches specificity and wins via source order, making
description textareas consistent with other form inputs. Local admin_tables.html
overrides for .form-textarea removed — styling now comes entirely from global CSS.
* fix(ui): add border:none to .code-block code + add CHANGELOG entries
Fixes light-gray border leaking into dark .code-block backgrounds.
Adds required CHANGELOG.md entries for all user-visible changes in this PR.
* fix(ui): add --border-dark token + reset border-radius in .code-block code
- Adds --border-dark: #C4C4C4 design token for hover border states
- Uses var(--border-dark) in both .btn-google:hover rules so hover border
is visually distinct from the base border (was a no-op with var(--border))
- Adds border-radius: 0 to .code-block code override to fully reset the
new global code border-radius on dark code-block backgrounds
* fix(ui): reset code border/bg inside .use-case-prompt dark container
Adds .plugin-detail .use-case-prompt code override to prevent the new
global code border and background from leaking into the dark #1e1e2e
pre block in marketplace_plugin_detail.html.
* fix(ui): reset code border in all dark-background containers
Global code { border } leaks into dark-themed containers across templates.
Adds border: none (+ border-radius: 0 where needed) to:
- marketplace_plugin_detail.html: lead-rendered pre code, sample-assistant-body code/pre code
- marketplace_item_detail.html: same three selectors
- home_onboarded.html, home_not_onboarded.html, admin_welcome.html: inline code on hero dark backgrounds
* fix(ui): uniform form typography — chip-input font, data-package desc textarea, orphan endif
- .chip-input container gets font-family/size tokens so inner input
inherits correctly (inline `font: inherit` was pulling browser default)
- cdp-desc / edp-desc switched from form-input to form-textarea so
description fields render Inter, not monospace
- Removed orphan {% endif %} left in admin_tables.html after rebase
(caused TemplateSyntaxError breaking all admin-tables tests in CI)
- .item-detail .use-case-prompt code: border/bg reset for dark container
* fix: relax test_keboola_discover_buttons assertion + CHANGELOG bullet for #347
The test_keboola_discover_buttons_hidden_on_bigquery_instance test
asserted bare-string `prefillFromKeboolaTable` not in the rendered
HTML on a non-Keboola instance. That made sense when the function
DEFINITION lived behind the keboola Jinja guard. #347 moves
several Keboola edit-modal helpers out from under the guard so
they're now defined as dead code on every instance, but the actual
call sites (`onclick="prefillFromKeboolaTable(...)"` + the
Discover buttons themselves) still respect the guard — which is
what actually matters for runtime behavior.
Updated the assertions to match `onclick="<fn>(` so they pin the
call-site contract, not the function-definition substring.
---------
Co-authored-by: ZdenekSrotyr <zdenek.srotyr@keboola.com>
150 lines
4.6 KiB
HTML
150 lines
4.6 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}Home — {{ instance_name or "AI Data Analyst" }}{% endblock %}
|
|
|
|
{% block content %}
|
|
{% include "_page_chrome.html" %}
|
|
<style>
|
|
.home-mock {
|
|
--hp-primary: #0073D1;
|
|
--hp-primary-dark: #0056A3;
|
|
--hp-primary-light: #E6F3FC;
|
|
--hp-border: #E5E7EB;
|
|
--hp-border-light: #F3F4F6;
|
|
--hp-text-primary: #111827;
|
|
--hp-text-secondary: #6B7280;
|
|
color: var(--hp-text-primary);
|
|
font-size: 14px;
|
|
line-height: 1.5;
|
|
}
|
|
.home-mock * { box-sizing: border-box; }
|
|
|
|
.home-mock .hero {
|
|
background: linear-gradient(135deg, #0073D1 0%, #0056A3 100%);
|
|
color: white;
|
|
border-radius: 16px;
|
|
padding: 38px 40px;
|
|
margin-bottom: 22px;
|
|
box-shadow: 0 8px 24px rgba(0, 86, 163, 0.18);
|
|
}
|
|
.home-mock .hero .eyebrow {
|
|
font-size: 11px;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.8px;
|
|
opacity: 0.85;
|
|
margin-bottom: 10px;
|
|
}
|
|
.home-mock .hero h1 {
|
|
font-size: 30px;
|
|
font-weight: 600;
|
|
letter-spacing: -0.4px;
|
|
margin-bottom: 12px;
|
|
line-height: 1.2;
|
|
color: white;
|
|
}
|
|
.home-mock .hero p {
|
|
font-size: 15px;
|
|
opacity: 0.94;
|
|
max-width: 680px;
|
|
line-height: 1.6;
|
|
}
|
|
|
|
.home-mock .section-label {
|
|
font-size: 11px;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.6px;
|
|
color: var(--hp-text-secondary);
|
|
margin: 30px 0 12px;
|
|
}
|
|
|
|
.home-mock .quick-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
|
|
gap: 18px;
|
|
margin-bottom: 18px;
|
|
}
|
|
.home-mock .quick-card {
|
|
background: white;
|
|
border: 1px solid var(--hp-border);
|
|
border-radius: 12px;
|
|
padding: 22px;
|
|
text-decoration: none;
|
|
color: inherit;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
transition: border-color .15s, box-shadow .15s;
|
|
}
|
|
.home-mock .quick-card:hover {
|
|
border-color: var(--hp-primary);
|
|
box-shadow: 0 4px 12px rgba(0, 115, 209, 0.10);
|
|
}
|
|
.home-mock .quick-card .ico {
|
|
font-size: 22px;
|
|
margin-bottom: 8px;
|
|
}
|
|
.home-mock .quick-card .ttl {
|
|
font-size: 15px;
|
|
font-weight: 600;
|
|
color: var(--hp-text-primary);
|
|
}
|
|
.home-mock .quick-card .desc {
|
|
font-size: 13px;
|
|
color: var(--hp-text-secondary);
|
|
line-height: 1.55;
|
|
}
|
|
</style>
|
|
|
|
<div class="home-mock">
|
|
{% set display_name = (user.name or (user.email or "").split("@")[0] or "back") %}
|
|
|
|
<div class="hero">
|
|
<div class="eyebrow">Welcome back, {{ display_name }}</div>
|
|
<h1>You're all set up</h1>
|
|
<p>
|
|
Open Claude Code in any project under <code style="background: rgba(255,255,255,0.12); border: none; padding: 1px 6px; border-radius: 4px; font-family: ui-monospace, 'SF Mono', Consolas, monospace; font-size: 12.5px;">~/{{ workspace_dir }}/Projects/</code>
|
|
and start a session — your data and plugins are already synced. Use the cards below to jump into the parts of {{ instance_brand }} you need.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="section-label">Quick links</div>
|
|
|
|
<div class="quick-grid">
|
|
<a class="quick-card" href="/dashboard">
|
|
<span class="ico">📊</span>
|
|
<div class="ttl">Dashboard</div>
|
|
<div class="desc">Sync state, table inventory, recent activity.</div>
|
|
</a>
|
|
<a class="quick-card" href="/catalog">
|
|
<span class="ico">📚</span>
|
|
<div class="ttl">Catalog</div>
|
|
<div class="desc">Browse tables, schema, and metric definitions.</div>
|
|
</a>
|
|
{# Curated Memory is user-facing — the /corporate-memory route runs
|
|
on get_current_user, so the card shows for everyone, matching
|
|
its primary-nav placement next to Data Packages. #}
|
|
<a class="quick-card" href="/corporate-memory">
|
|
<span class="ico">🧠</span>
|
|
<div class="ttl">Curated Memory</div>
|
|
<div class="desc">Shared analyst knowledge and prior solutions.</div>
|
|
</a>
|
|
{# Activity Center admin-only — parity with the top-nav gating. #}
|
|
{% if is_admin %}
|
|
<a class="quick-card" href="/activity-center">
|
|
<span class="ico">📈</span>
|
|
<div class="ttl">Activity Center</div>
|
|
<div class="desc">Per-user analytics on {{ instance_brand }} adoption.</div>
|
|
</a>
|
|
{% endif %}
|
|
{% if is_admin %}
|
|
<a class="quick-card" href="/admin/server-config">
|
|
<span class="ico">⚙️</span>
|
|
<div class="ttl">Admin</div>
|
|
<div class="desc">Server configuration, RBAC, marketplaces.</div>
|
|
</a>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|