KATURA
Your browser is not supported. Please update your iPad to the latest iOS version, or visit us on a newer device.
How to update your iPad Skip to main content JOIN THE WORLD OF KATURA Be the first to discover new collections, exclusive events, and the stories behind our legendary creations.
KaturaβCrafting timeless treasures since 1999.
The technology behind Katura is built in-house. K99 is our jewelry business platform β available to other jewelers.
Β© 2026 KATURA. All rights reserved.
πΊπΈ English EN πΊπΈ United States $
Software Updates Β· KATURA | KATURA
Live from GitHub Β· Refreshed continuously
Software Updates Every change we ship to katura1999.com β features, fixes, security patches, the lot. Pulled straight from our private GitHub repository so you can see exactly what was built and when.
By the numbers Lines of code
828,292
Web platform β TypeScript, React, Prisma, CSS
iOS
78,204
Swift + SwiftUI lines
Android
3,117
Kotlin + Jetpack Compose lines
All platforms
909,613
Web + iOS + Android combined (44.5Γ the King James Bible)
Characters written
35.04M
35,041,420 total characters
Updates pushed
1,893
exact commit count on main
Current version
v1.18.93
build 1893 Β· 1c76417
Database models
392
across 47 schema files β most SaaS platforms have 20β50
API endpoints
955
individually routed β Stripe's public API has ~400
Translated strings
82,512
every string, in 24 languages
System permutations
10^287
2^955 endpoint combinations β more than atoms in the observable universe (10^80)
Project age
6mo 15d
since Dec 14, 2025
Pre-AI dev hours
30.3K hrs
909,613 lines Γ· 30 LOC/hr β equivalent to 14.6 years (senior engineer, no AI)
With-AI dev hours
7.6K hrs
4Γ AI productivity multiplier (2024β2026 studies) β equivalent to 948 days
Equivalent firm cost
$7,859,919
live ticker Β· Katura rate: $60 USD/hr
Hours estimated from source line count at 30 LOC/hr (industry benchmark for production-quality TypeScript/React without AI assistance), with a 4Γ multiplier for AI-assisted development per published 2024β2026 enterprise studies. Equivalent Firm Cost uses a $250/hr loaded billable rate reflecting a premium engineering firm building enterprise-grade SaaS β and ticks up live, because the project is still being actively built.
Commit history
1,893 updates pushed Showing page 25 of 40 Β· 1,201β1,250 of 2,000 fetched
Thursday, February 12, 2026 6 updates pushed
Update 8:15 AM Β· ZRosserMcIntosh
Repair orphaned cap table data after company row deletion Added repair_cap_table_company.sql migration to re-link all child records Made getOrCreateDefaultCompany() more robust: Prioritizes parent companies (parent_company_id IS NULL) Falls back to any company Auto re-links orphaned child records when creating a new company Fixes 500 error when company row was manually deleted from database 8:11 AM Β· ZRosserMcIntosh
Add error logging and deployment checklist Enhanced GET endpoint error logging with detailed error messages Created DEPLOYMENT_CHECKLIST.md with step-by-step migration instructions Helps debug '500 errors' when cap_compliance_deadlines table doesn't exist yet 7:50 AM Β· ZRosserMcIntosh
Phase 2 Batch B: Diligence Package PDF, Waterfall/Exit, Stakeholder Statements, Compliance Calendar Diligence Package PDF export (one-click PDF: cap table, option pool, convertibles, rounds, 12-month event log) Waterfall/Exit Outcomes with full participation support (participating, capped participating, non-participating conversion) Per-stakeholder breakdown in waterfall (shows payout by shareholder) Stakeholder Statement PDF (2-page PDF: holdings, options, convertibles, transaction history) Entity Compliance Calendar tab (12th tab: filing deadlines, status tracking, per-subsidiary deadlines) Compliance deadline CRUD API (create, update, delete with auto-status computation) migrations/seed_cap_table_katura.sql β Day 1 seed: October Skies Benediction LLC (SC LLC), 8.5M Common to Lee Wiser McIntosh migrations/add_cap_compliance_calendar.sql β Compliance schema (3 enums, 1 table, indexes) migrations/fix_company_entity_details.sql β Update company from Delaware C-Corp to SC LLC src/app/api/admin/cap-table/diligence/route.tsx β Diligence Package PDF generation + Supabase upload src/app/api/admin/cap-table/diligence/pdf-template.tsx β 7-page diligence PDF template src/app/api/admin/cap-table/stakeholder-statement/route.tsx β Per-stakeholder statement PDF src/app/api/admin/cap-table/stakeholder-statement/pdf-template.tsx β 2-page statement template src/app/admin/cap-table/page.tsx: Added ComplianceDeadline interface Added complianceDeadlines to CapTableData Enhanced LiquidationStack β Waterfall with participation, capping, per-stakeholder breakdown Added 12th 'Compliance' tab with ComplianceCalendarTab component Added diligence PDF button to export dropdown Added per-stakeholder statement button with action dropdown Updated StakeholdersTab to accept asOfDate and redactPII props Added action column to stakeholders table src/app/api/admin/cap-table/route.ts: Added complianceDeadlines query to GET (with graceful degradation) Added 3 compliance CRUD handlers (create, update, delete) Updated default company creation to October Skies Benediction LLC, SC LLC docs/cap-table/ROADMAP.md: Marked Phase 2 as Complete Updated Batch B items to β
Done Added new files and architecture notes docs/cap-table/CAP_TABLE_AND_SUBSIDIARIES.md: 7:01 AM Β· ZRosserMcIntosh
Phase 2: Cap table investor-ready layer β 7 new components + Modeling tab BoardApprovalBanner: Official/Pending status with draft count & last approval HealthChecksPanel: Collapsible warnings (auth<issued, pool overcommit, orphan data, missing PII) ProFormaSimulator: Model hypothetical rounds with dilution, SAFE conversion, pool refresh LiquidationStack: Visual seniority stack + exit waterfall with payout calculator VestingDashboard: 30/60/90 day vesting milestones, expiring grants tracking OwnershipOverTimeChart: Stacked area chart (founders/investors/pool/other over rounds) IntercompanyEconomicsSummary: Entity cash flows, agreement-type rollups, top counterparties Feature 6:45 AM Β· ZRosserMcIntosh
cap table system, subsidiaries management, profile photo fix, investors footer link Fix admin header profile photo showing stale session image (fetches fresh from DB) Full cap table system at /admin/cap-table with 10 tabs: Overview, Ownership, Stakeholders, Shares, Options, Convertibles, Rounds, Events, Subsidiaries, Setup SQL migrations: 13 tables, 14 enums for cap table + subsidiaries extension API routes: 26+ CRUD actions with audit logging Subsidiaries tab: 20-country support, corporate tree view, intercompany agreements Add Investors link to footer Company column (all 24 locales) Documentation: docs/completed/CAP_TABLE_AND_SUBSIDIARIES.md Update 4:08 AM Β· ZRosserMcIntosh
filter products API by Katura storefrontId Added storefrontId filter to GET /api/admin/products (defaults to katura_storefront_001) Prevents mixing Rosser/trunk show products in admin product listing Wednesday, February 11, 2026 14 updates pushed
Feature 4:20 PM Β· ZRosserMcIntosh
simplify mobile header to show only shopping bag icon Hide search, wishlist, and user menu icons on mobile screens Only display shopping bag icon on mobile to reduce header clutter Logo now has more prominent center position on mobile Search, wishlist, and account remain accessible via hamburger menu Icons reappear on tablet/desktop (sm breakpoint and above) Feature 4:16 PM Β· ZRosserMcIntosh
add comprehensive Ukrainian translations Translate common UI elements and navigation Add Ukrainian translations for homepage, hero, and trust signals Complete footer, engagement, education sections Translate product, shop, cart, wishlist sections Add blog and account Ukrainian translations Progress: significantly improved Ukrainian localization Tuesday, February 10, 2026 21 updates pushed
Update 10:40 PM Β· ZRosserMcIntosh
Brevo product URLs /products/ β /creations/ to match actual site routes Root cause of marketing email 404s: Brevo ecommerce sync was using /products/{slug} but the site uses /creations/{slug}. This fixes the source. A product resync will update all URLs in Brevo. Update 10:23 PM Β· ZRosserMcIntosh
fuzzy slug matching for partial/incorrect product URLs When exact slug not found, tries matching all keyword segments against active products. e.g. south-seas-pearls-diamond-clasp will match south-seas-pearls-on-diamond-and-14k-white-gold-clasp 10:16 PM Β· ZRosserMcIntosh
add /products/ redirect to /creations/ for marketing email links Monday, February 9, 2026 7 updates pushed
Feature 4:59 PM Β· ZRosserMcIntosh
@mentions, @username tasks, CAD design page, employee/goals translations, salesRep leaderboard fix Messages: @mentions use username with highlighted styling (bg-primary/10) Tasks: Assignee display shows @username format CAD Design: New /admin/design page with Supabase 'cad' bucket, upload/download/delete/folder support Employee sub-pages: Full EN+PT translations for company-structure and careers Goals: Full EN+PT translations for all tabs (leaderboard, goals, achievements, commissions) Goals: Translated goalTypes and goalPeriods with useMemo Leaderboard: Fixed to aggregate by salesRepId instead of userId (customer) Commission: Auto-calculation already in place via order PATCH when salesRepId is assigned Navigation: Added CAD Design - For Antar to sidebar with PenTool icon Fixed: messages realtime sender username type, tasks JSX syntax error, company-structure t scope Feature 10:27 AM Β· ZRosserMcIntosh
complete messenger page rewrite with Slack-level features Rewrote messages page (1921 lines) with sticky bottom input Added 6 new API routes: members, mute, message edit/delete, reactions, pins New web notifications hook with AudioContext chime sound Sunday, February 8, 2026 2 updates pushed
6:34 PM Β· ZRosserMcIntosh
Fix broken logo paths and design-your-ring white area on mobile Replace all 'logo copy 2.png' and 'logo copy.png' refs with 'logo.png' Affected: header, footer, login, register, home page, gift cards, wholesale, employee login, admin layout, mobile nav Add dark background wrapper to design-your-ring layout to eliminate white gaps between header/footer and dark page content on mobile Update 5:46 PM Β· ZRosserMcIntosh
Move LocaleAttributes inside NextIntlClientProvider to resolve intl context error LocaleAttributes was rendered outside NextIntlClientProvider but uses useLocale() hook This caused 'No intl context found' error on all pages Moved component inside provider to give it access to intl context
Updated company example reference
Compliance deadlines table supports: subsidiary-specific deadlines, filing portal URLs, fees, confirmation numbers
Auto-computes status (OVERDUE/DUE_SOON/UPCOMING) based on due_date
Supports recurrence types: ONCE, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, BIENNIAL
14 deadline types: ANNUAL_REPORT, TAX_FILING, FRANCHISE_TAX, BENEFICIAL_OWNERSHIP, BUSINESS_LICENSE, etc.
Legal Name: October Skies Benediction LLC
DBA: Katura 1999
Jurisdiction: South Carolina
Entity Type: LLC
Incorporation Date: 2026-02-12
Founder: Lee Wiser McIntosh (100% shareholder) Feature 4:05 PM Β· ZRosserMcIntosh
improve mobile menu UI with rounded corners and better spacing Add rounded-r-3xl corners to mobile hamburger menu drawer Center Katura logo in mobile menu header Add horizontal padding (px-4) to navigation sections and items Add px-2 to main container for consistent spacing Improves readability and visual polish on mobile devices Update 1:54 PM Β· ZRosserMcIntosh
add scrolling to language selector dropdown Added max-height and overflow-y-auto to language dropdown so it matches the height of currency selector instead of extending off-screen with 24 languages. Users can now scroll through the language list. Update 10:10 AM Β· ZRosserMcIntosh
use correct User table in CustomerMarketingProfile view recreation The view queries the User table, not a Customer table. Matched the original definition from add_brevo_marketing_tables.sql. Feature 10:08 AM Β· ZRosserMcIntosh
expand to 24 languages, 30 currencies, full SEO, security fixes Flag emoji next to currency in 'keep currency' button Inverse language prompt when switching currencies All 24 locales in language selector with correct flags All 30 currencies organized by region in currency selector Feature i18n 9:31 AM Β· ZRosserMcIntosh
translate all footer-linked pages into 10 languages Contact page + ContactCards + ContactForm client components Shipping & Delivery page Returns & Exchanges page (+ add generateMetadata) About page (milestones, values, certifications all translated) Careers page (+ translate generateMetadata) Privacy Policy page (+ add generateMetadata) Terms of Service page (+ add generateMetadata) Accessibility Statement page (+ add generateMetadata) 8:31 AM Β· ZRosserMcIntosh
Contact page: hide phone for guests, remove email, WhatsApp button Phone number only visible to signed-in users; guests see a lock icon with a prompt to sign in or use the contact form below Removed email display entirely (ObfuscatedEmail card gone) WhatsApp card now has a green 'Open WhatsApp' button that links directly to wa.me with a pre-filled greeting Layout changed from 4-column to 3-column (Phone, WhatsApp, Hours) Extracted ContactCards client component for session awareness 8:17 AM Β· ZRosserMcIntosh
Add compensation currency/pay period to employees, South American currencies, and product reviews Fix compensation inconsistency between /admin/employees and /admin/analytics/team Employees page now reads from TeamMemberPay (source of truth) with User model fallback Saving compensation from employees edit dialog syncs to both User and TeamMemberPay refreshEmployees now also refreshes pay records Add pay period selector (Weekly, Bi-Weekly, Semi-Monthly, Monthly, Quarterly) Add compensation currency selector with all supported currencies Show live exchange rate conversion in table and edit form (e.g. R$2.000/yr β $540 USD) Add South American currencies: COP, PEN, CLP, ARS Added to SUPPORTED_CURRENCIES with symbols, flags, locales Added rounding rules and fallback exchange rates Added to currency selector footer under South America Added to Spanish language currency options SQL migration: add compensationCurrency column + QUARTERLY enum value Product reviews system (from previous session) Update 7:30 AM Β· ZRosserMcIntosh
move ssr:false dynamic import to client component wrapper next/dynamic with ssr:false cannot be used in Server Components. Created LazyEmailSignupPopup client component that wraps the dynamic import, then import that from the server layout. Perf 7:24 AM Β· ZRosserMcIntosh
prioritize product image + name by deferring all non-critical fetches Add <link rel='preload'> for hero product image in HTML head (browser starts fetching immediately, before any JS loads) Defer cart/wishlist/exchange-rate API calls via requestIdleCallback (these now fire AFTER first paint instead of blocking it) Lazy-load EmailSignupPopup with next/dynamic + ssr:false (removes it from initial JS bundle; it has 7s delay anyway) Stream related products via Suspense instead of awaiting them (product hero renders immediately, related products stream in after) Perf 7:07 AM Β· ZRosserMcIntosh
eliminate duplicate API calls, remove reCAPTCHA from global layout, disable link prefetch spam Remove ReCaptchaProvider from root layout (saves ~800ms script load on every page) Make useRecaptcha hook safe without provider (graceful degradation) Add prefetch={false} to all Link components in header (~15 links) Add prefetch={false} to all Link components in footer (~25 links) Eliminate duplicate /api/wishlist call: WishlistButton now uses WishlistContext instead of its own useEffect fetch (saves ~1000ms redundant API call) Add Cache-Control headers to /api/products/[id]/variants (5min CDN cache) Removed: reCAPTCHA scripts (797ms + children) Removed: RSC prefetch spam for /cart, /wishlist, /jewel-vox, / etc (~600-750ms each) Removed: Duplicate /api/wishlist call (1011ms) Cached: Variants API (was 1296ms uncached, now CDN-cached for 5 min) Update 6:48 AM Β· ZRosserMcIntosh
product gallery video/photo bug + page performance optimization Video no longer auto-plays on page load β plays only on hover over the first photo (hover-to-play with badge hint) Clicking thumbnails/arrows now correctly switches between still photos β video overlay only appears when actively playing Video preload changed from 'auto' to 'none' β eliminates the heavy video download that was blocking initial page load Video pauses and resets when navigating away from first image Added Play icon badge on first thumbnail to indicate video Wrap getProduct() in React cache() to deduplicate the call between generateMetadata() and the page component (was hitting DB twice for every page load) Parallelize getRelatedProducts() β 4 jewelry type queries now run via Promise.all instead of sequential for loop (4x faster) Parallelize getProduct() + getTranslations() with Promise.all Add Suspense boundary around SimilarProducts (AI recs) so the client-side fetch doesn't block initial page paint Add proper sizes attributes to all Image components for responsive image optimization Set priority only on first gallery image, lazy-load thumbnails Related product images sized 400x400 (was 200x200) to prevent blurry upscaling on retina displays Related products now link via slug instead of ID for cleaner URLs Added slug to related product select fields Update 6:16 AM Β· ZRosserMcIntosh
design-your-ring mobile white glow + black-on-black username Add useEffect to set body/html background to #0a0a0f on mount, restoring original on unmount β eliminates white glow visible through iOS overscroll and layout gaps Pass isDarkPage prop from Header to UserMenu instead of fragile window.location check β fixes black text on dark header for logged-in users on design-your-ring and developer pages Update 9:05 PM Β· ZRosserMcIntosh
stripe webhook endpoint URL and order payment status Fixed Stripe webhook URL: katura.vercel.app β katura1999.com Added missing webhook events: checkout.session.* events Manually confirmed KAT-MLH23A05 payment (webhook had failed delivery) Future orders will auto-confirm on payment_intent.succeeded Update 7:44 PM Β· ZRosserMcIntosh
register form email-first, hero table migration SQL Registration: moved email field above name field on both /register and /register?promo=welcome100 Registration: changed placeholder from 'Your full name' to 'Your Name' Migration SQL: drop+recreate HeroPinRule and HeroBoostRule with correct schema (slotIds[], startDate/endDate, createdBy, etc.) β fixes 500 on /admin/analytics/hero Feature 7:00 PM Β· ZRosserMcIntosh
hero pagination+pinning, ShipStation auto-export, platform gap analysis Hero analytics: paginated results up to 50/page (15/25/50 selector) Hero mosaic: admin pin management API + UI (force-include products) Collage API: pinned products get weight=100 for guaranteed display Product search API: added slug, price, jewelryType fields ShipStation: auto-export orders on Stripe payment confirmation ShipStation: 15-min cron sync added to vercel.json Gap analysis: comprehensive doc comparing promo page vs actual features Feature 6:43 PM Β· ZRosserMcIntosh
welcome gift $500 min, mobile popup centering, admin-editable offer, smart registration Popup centered on mobile (left-1/2 -translate-x-1/2) $100 gift only redeemable on orders over $500 (configurable) New /api/welcome-offer endpoint reads from WELCOME100 promotion Popup, register API, and checkout all read amounts dynamically Register page detects existing customers, prompts for password only check-email API returns set-password for any passwordless user Duplicate gift card issuance prevention for returning customers Auto sign-in after returning customer activates account Update 6:01 PM Β· ZRosserMcIntosh
exclude trunk show from hero mosaic cache + redirect to cart on Add to Bag Added 'hero-mosaic' tag to ISR fetch and unstable_cache for on-demand revalidation Created /api/admin/revalidate-hero endpoint to bust mosaic cache Bulk edit trunk-show actions now auto-revalidate hero mosaic cache DB queries already correctly exclude trunk-show tagged products; issue was stale ISR/API cache from before tags were applied AddToCartButton now redirects to /cart by default after successful add Added redirectToCart prop (default true) for CTA reinforcement Wishlist uses redirectToCart=false to keep toast-only behavior Feature 5:55 PM Β· ZRosserMcIntosh
3-step checkout flow (Information β Payment β Confirmed) Redesigned checkout from 2-step to 3-step inline flow Step 1 (Information): contact, shipping address, gift options, promo codes Added sign-in/create-account option for guest customers Changed lead time notice from yellow/amber to stone color scheme Removed lead time checkbox, replaced with passive acceptance text Step 2 (Payment): Stripe PaymentElement with billing auto-filled from step 1 Shows shipping summary with edit button to go back Step 3 (Confirmed): inline order confirmation (no redirect to /checkout/success) Shows order number, confirmation email, What Happens Next steps Continue shopping and view order status buttons Added 3-step progress indicator with emerald checkmarks Fixed PaymentForm to not redirect when onSuccess callback is provided /checkout/success route preserved as fallback for redirect-based payments (3DS, Pix) Added translations for all 10 languages (en, pt, de, es, fr, it, ja, ko, zh, ar) Feature 5:33 PM Β· ZRosserMcIntosh
tag-based trunk show system with bulk edit Products tagged 'trunk-show' are excluded from category pages, hero mosaic, and related products But keep their actual jewelryType (Bracelet, Earrings, etc.) for SEO POST /api/admin/products/bulk-edit - bulk add/remove trunk show tags /admin/products/bulk - bulk edit page with product selection and filters Trunk Show checkbox on individual product edit form category-page.tsx: tags filter instead of jewelryType check creations/page.tsx: tags filter for main shop creations/trunkshow/page.tsx: query by tag instead of jewelryType creations/[id]/page.tsx: related products exclusion by tag admin products/trunkshow API: query by tag admin products page: trunk show count by tag hero analytics/collage/cache: tag-based exclusion payment intent: tag-based trunk show detection Removed 'Trunkshow Special' from jewelry type dropdowns Update 3:56 PM Β· ZRosserMcIntosh
reclassify 18 trunk show products to correct jewelry types, boosting hero eligibility from 71 to 89 Updated 17 'Trunkshow Special' products to their actual types (Earrings, Bracelet, Necklace) Fixed 1 product with null jewelryType ('Pearl Stud Earrings Light Gold Round Orb' -> Earrings) Removed now-unnecessary trunk show exclusion filter from 3 locations: src/app/api/admin/analytics/hero/route.ts src/app/api/products/collage/route.ts src/lib/cache/collage-cache.ts Final distribution: Earrings=40, Necklace=27, Ring=13, Bracelet=9 Feature 3:16 PM Β· ZRosserMcIntosh
Brevo eCommerce product sync for email editor Product Block Add src/lib/brevo/ecommerce.ts - full Brevo eCommerce API client (activate, create/update products, batch sync, categories, list) Add src/app/api/admin/brevo/products/route.ts - admin API for manual sync (activate, full sync, single product sync, list) Add src/app/api/cron/brevo-product-sync/route.ts - nightly cron syncs all active products + categories to Brevo at 5 AM Update daily cron to include product sync as Task 6 Update vercel.json with brevo-product-sync cron schedule Batch fallback: if batch API fails, falls back to individual product sync so partial failures don't block the entire catalog 9:24 AM Β· ZRosserMcIntosh
Fix hero mosaic eligibility: add Pendant type, trunk show exclusion, and storefront filtering Add 'Pendant' to JEWELRY_TYPES in collage route, analytics route, and collage cache Add explicit storefrontId filter to analytics route and collage cache (katura_storefront_001) Add NOT filter to exclude 'Trunkshow Special' products from hero mosaic Update category-to-type mapping: pendants -> 'Pendant' (was 'Necklace') Update analytics rules text to reflect current filtering criteria 9:15 AM Β· ZRosserMcIntosh
Suppress CSS inline style and Tailwind class lint warnings Replace inline style={{ gridTemplateColumns }} with Tailwind grid-cols-N classes via lookup map in media/page.tsx Add tailwindCSS.lint.suggestCanonicalClasses: ignore to suppress z-[100]->z-100 and sm:w-[200px]->sm:w-50 class shorthand hints Add css.lint.inlineStyles: ignore at top level and per-language scope for any remaining inline style usage in TSX files 8:42 AM Β· ZRosserMcIntosh
Fix 4 QA issues: header dark mode, design folder nav + previews, media size control, marketing redirect 1. Header dark mode (/design-your-ring): Account name/icon now properly inverts to white on dark pages (expanded isDarkPage check in user-menu) 2. Admin design page: Fixed folder detection (Supabase returns id=null for folders), fixed folder click navigation to build full paths, fixed back button to go up one level, added image previews with signed URLs in both grid and list views 3. Admin media page: Added adjustable grid size control (2-8 columns per row) with slider and +/- buttons for viewing more images at once 4. Marketing/media redirect: All 3 marketing/media sub-pages now redirect to /admin/media to eliminate redundancy 7:45 AM Β· ZRosserMcIntosh
Fix 4 admin bugs: revenue mismatch, folder date, Leads0, drag-drop Customers page was showing all-time totalSpent from User model Dashboard shows trailing 12-month revenue from settled Orders Now both use the same calculation: 12-month settled order totals Label changed to 'Revenue (12 mo)' with consistent formatting Supabase Storage folder objects have null/empty created_at new Date(null) resolves to Unix epoch (12/31/1969) Added formatDate() helper that returns 'β' for invalid/epoch dates Applied to both grid and list views, plus sort comparator Classic React bug: {0 && <Component/>} renders literal '0' Changed condition from 'item.badge && item.badge > 0' to 'Number(item.badge) > 0' which evaluates to boolean false Replaced relatedTarget-based dragLeave with drag counter pattern Added onDragEnter handler with Files type check Counter increments on enter, decrements on leave, resets on drop More reliable across browsers and nested DOM elements 7:25 AM Β· ZRosserMcIntosh
Fix 4 admin issues: CAD drag-drop upload, taxonomy counts, birthday timezone, wholesale PT translations Added drag-and-drop file upload to the entire page and individual folders Folders visually highlight when dragging files over them (πβπ) Added 'Upload to [folder]' button when inside a folder Empty folders now show drag-and-drop hint instead of generic message Product counts now match by productType/jewelryType/productCategory name Previously only counted ProductCategoryLink entries (always 0 for Shopify imports) Children categories also get enriched product counts Category creation: improved error handling, wrapped audit log in try/catch Added timeZone: 'UTC' to all birthday/anniversary date displays Fixed off-by-one day bug (UTC midnight β local timezone shift) Applies to customer detail page and linked people card Added wholesalePage section to AdminTranslations (EN + PT) Created WholesaleHeader reusable component for translated page titles Translated: WholesaleNav, WholesaleOverview, WholesaleAccountsClient, WholesaleLeadsClient, WholesaleSettingsClient All 5 wholesale pages and pipeline now use translated headers Update 6:50 AM Β· ZRosserMcIntosh
Hero mosaic DESIGN YOUR RING button to point to /design-your-ring instead of /engagement/design Update 6:34 AM Β· ZRosserMcIntosh
DESIGN YOUR RING button to use relative link instead of hardcoded absolute URL 2:48 AM Β· ZRosserMcIntosh
Complete 5 admin panel tasks: CAD upload flow, hero mosaic audit, translations, bug fixes Chore 1:52 AM Β· ZRosserMcIntosh
update Design Your Ring button to external URL Changed home page CTA button from internal route /engagement/design to https://katura1999.com/design-your-ring Updated navigation config to use external URL for consistency Button now directs to external design-your-ring page
Database migration: ChatPinnedMessage, WebPushSubscription, NotificationPreference tables
Features: add/remove people, edit/delete messages, pin/unpin, mute (timed & indefinite)
30-emoji picker, @mentions, message search, channel settings sheet
System messages for member changes, pinned messages
Channel creation with type selection (Group/Project/Announcement)
Hover action toolbar with quick reactions, reply, more menu
All 8 files verified zero errors Feature 9:09 AM Β· ZRosserMcIntosh
Re-enable commission rate fields in orders API Viewing commission rates on orders Seeing calculated commission amounts Full commission tracking integration with sales rep assignments Chore 9:07 AM Β· ZRosserMcIntosh
Add migration helper scripts for commission tracking add_order_commission_columns.sql: Quick fix for missing Order commission columns check_commission_migration_status.sql: Diagnostic script to check migration status Update 9:04 AM Β· ZRosserMcIntosh
Remove commission rate fields from orders API to prevent 500 errors The orderCommissionRate and orderCommissionAmount fields were selected in the orders API query but may not exist in production database yet. Temporarily removed from API response to fix 500 errors. Commission tracking still works via /api/admin/commissions endpoint and the orders [id] route which handles commission calculation. Feature 8:12 AM Β· ZRosserMcIntosh
Add commission tracking and employee compensation system Commission Tracking: New /admin/goals Commissions tab with filterable table, bulk approve/pay, monthly totals Sales Rep Assignment: Dropdown on /admin/orders rows to assign sales rep; auto-calculates commission Employee Compensation: /admin/employees now has salary, hourly rate, commission rate, job title, department, start date, reports-to fields Page Restructuring: /admin/employees is Team Members only; /admin/employees/audit and /admin/employees/careers as separate pages Company Structure: New /admin/employees/company-structure page with recursive org chart, role/dept badges, stats Database: Added User compensation fields, Order sales rep tracking, new CommissionRecord model with status workflow API: New /api/admin/commissions route for commission management; updated orders and users routes UI: Enhanced employees table with commission/compensation columns (owner only), navigation bar for sub-pages 5:04 AM Β· ZRosserMcIntosh
Update header logo to new AVIF design Add new header-logo.avif to public/brand/ Update both mobile and desktop header logo references