Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
3a3cac6
feat: migrate foundation — tokens, SCSS primitives and core utilities
Lantum-Brendan Sep 1, 2026
ca439c5
feat: complete foundation — add sidebar/avatar/markdown/password helpers
Lantum-Brendan Sep 1, 2026
49694e6
feat: migrate Logo, GoogleIcon, AuthDivider, HamburgerMenu and ThemeT…
Lantum-Brendan Sep 1, 2026
10932fe
feat: migrate LoadingSkeleton, EmptyState, TypingDots, AuthFooterLink…
Lantum-Brendan Sep 1, 2026
65fcde8
refactor: compose primitives in EmptyState, LoadingSkeleton, AuthDivi…
Lantum-Brendan Sep 4, 2026
fab1b0a
refactor: compose TButton in ThemeToggleButton and ViewToggle
Lantum-Brendan Sep 4, 2026
cfff339
feat: migrate ComponentLoader, TAvatar, SearchInput and ExtensionSlot…
Lantum-Brendan Sep 4, 2026
d713235
feat: add AuthSocialLogin, AuthCarousel, ThemeSelector, LanguageSelec…
Lantum-Brendan Sep 4, 2026
28fa038
refactor: address review feedback on decoupling, asset bundling, and …
Lantum-Brendan Sep 6, 2026
b39bfed
feat: migrate second batch of 10 components and add stories
Lantum-Brendan Sep 10, 2026
4de8cbb
feat: add table and content components with stories
Lantum-Brendan Sep 16, 2026
2d8a932
feat: migrate TTopCard, ContentSection, ContentListView, IconPicker, …
Lantum-Brendan Sep 16, 2026
ecceb6a
feat: add domain cards and summary strips with stories
Lantum-Brendan Sep 17, 2026
21192a3
feat: add dashboard widgets and report summary cards with stories
Lantum-Brendan Sep 17, 2026
c625026
feat: migrate reports views and dashboard agent hero with stories
Lantum-Brendan Sep 17, 2026
96cfec7
feat: migrate transaction domain components with stories
Lantum-Brendan Sep 17, 2026
6a7deca
feat: migrate entity forms, detail panels and learning modal with sto…
Lantum-Brendan Sep 17, 2026
d73baf2
chore: add component migration rules and update architecture tracker
Lantum-Brendan Sep 17, 2026
0061ef5
feat: migrate settings, onboarding wizard and user detail with stories
Lantum-Brendan Sep 17, 2026
1b044b0
feat: migrate imports, financial position and outreach composer with …
Lantum-Brendan Sep 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .cursor/rules/component-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
description: Component migration and primitive design guidelines for @trakli/ui-kit
globs: components/**/*.vue, composables/**/*.ts, utils/**/*.ts
---

# Component Migration & UI Kit Quality Rules

When migrating components from `webui` into `@trakli/ui-kit`:

1. **No String Concatenation for Copy (i18n)**:
- Do NOT construct text via template literals (`You don't have any ${pageName.toLowerCase()}...`).
- Expose explicit `title`, `description`, `actionLabel` props and slots (`#title`, `#description`, `#actions`) so consumers provide translated strings.

2. **Self-Contained Static Assets**:
- Do NOT reference external public URLs like `/logo.svg` or `/_nuxt/logo.svg`.
- Bundle SVGs/images directly into `assets/` and import them statically (`import logoUrl from '../assets/logo.svg'`).

3. **Strict Primitive Composition**:
- Do NOT render raw HTML interactive/layout tags (`<input>`, `<button>`, `<div class="card">`, `<hr>`) when primitives exist.
- Always compose: `TInput`, `TButton`, `TCard`, `TDivider`, `TDropdown`, `TDropdownItem`.

4. **Preserve Dynamic Polymorphism & Escape Hatches**:
- Never collapse dynamic descriptor branches into hardcoded constants.
- Always keep plugin component escape hatches (`resolveComponent(ui.component)`), slot variants, and fallbacks.

5. **Extensible Menus & Navigation**:
- Do NOT hardcode domain-specific menus (e.g., Settings/Admin/Logout) into UI kit primitives.
- Provide an `items` array prop (`MenuItem[]`) and `#menu` / `#header` slots with sensible defaults.

6. **Zero Migration Noise & Strict Types**:
- Never commit scaffolding/transitional comments (`Migrated from webui/...`, `Tier 0 primitive`, `mirrors ...`).
- Never use `@ts-nocheck` to silence TypeScript errors. Fix types properly.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@ cypress/videos
cypress/downloads
*.log
.DS_Store

.playwright-mcp/
38 changes: 35 additions & 3 deletions .storybook/preview.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,44 @@
// Default token values so components are themed in isolation.
import '../assets/css/tokens.css';

// NuxtLink is provided by Nuxt at runtime. Outside Nuxt (Storybook), register a
// minimal stand-in so components that render links still mount.
import { setup } from '@storybook/vue3';
import { h } from 'vue';
import { h, ref } from 'vue';

// Minimal en translations for storybook preview
const messages = {
'Sign in with Google': 'Sign in with Google',
'Sign up with Google': 'Sign up with Google',
'Theme': 'Theme',
'Light': 'Light',
'Dark': 'Dark',
'System': 'System',
'Language': 'Language',
'Cancel': 'Cancel',
'Confirm': 'Confirm',
'carousel.ai.title': 'Just ask',
'carousel.ai.text': 'Log expenses, build reports and get answers by chatting with your assistant in plain language.',
'carousel.integrations.title': 'Connect your bank',
'carousel.integrations.text': 'Link accounts with Plaid and import statements, so your transactions flow in on their own.',
'carousel.import.title': 'Import anything',
'carousel.import.text': 'Drop in a statement in any format and the assistant reads it, structured or not, into clean transactions.',
'carousel.welcome.title': "Sit back, we've got this",
'carousel.welcome.text': "You handle life. Trakli wrangles the receipts, the math and the mess. Welcome aboard!"
};

const locale = ref('en');
const t = (key) => messages[key] || key;
const setLocale = (l) => { locale.value = l; };

// Provide global nuxt helper stand-ins so components can render cleanly in Storybook
window.useI18n = () => ({ t, locale, setLocale });
window.useCookie = () => ref('mock-cookie');
window.useApi = () => async () => ({ data: {} });

setup((app) => {
app.config.globalProperties.t = t;
app.config.globalProperties.locale = locale;
app.config.globalProperties.setLocale = setLocale;

app.component('NuxtLink', {
props: { to: { type: [String, Object], default: '#' } },
setup(props, { slots }) {
Expand Down
957 changes: 957 additions & 0 deletions UI_ARCHITECTURE.md

Large diffs are not rendered by default.

23 changes: 23 additions & 0 deletions assets/bulbIcon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/flags/de.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/flags/es.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/flags/fr.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/flags/gb.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions assets/flags/it.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions assets/flags/pt.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading