ef22e92ac8
Command palette (cmd+K) with fuzzy nav, ticket search, people lookup and action entries (new ticket, logout, show shortcuts). Opens from keyboard or user dropdown. Global keyboard shortcuts via a small useShortcut/useLeaderShortcut hook: `?` help overlay, `c` new ticket, `g d|t|m|n|s` leader nav. Tickets list: j/k cursor, Enter open, x toggle select. TicketDetail: `e` edit, `r` focus comment composer. All guarded against firing inside text fields. @mention autocomplete in the comment composer (MentionTextarea) with arrow-key nav and Tab/Enter insert. Rendered comments and audit log rewrite @username tokens to links pointing at that user's assignee filter; unknown usernames left as plain text. Mobile sweep: TicketDetail sidebar stacks below content on <md, Settings profile grid collapses to one column, admin tables get horizontal scroll with a 640px min width, CTI 3-column grid stacks vertically on <md, New ticket severity/assignee grid same. PWA: manifest.webmanifest, SVG icon, minimal network-first service worker for the app shell (never caches /api/*), registered in production builds only. Theme-color meta + manifest link in index. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
28 lines
841 B
TypeScript
28 lines
841 B
TypeScript
import { StrictMode } from 'react';
|
|
import { createRoot } from 'react-dom/client';
|
|
import { QueryClientProvider } from '@tanstack/react-query';
|
|
import { queryClient } from './api/queryClient';
|
|
import { ThemeProvider } from './contexts/ThemeContext';
|
|
import { Toaster } from '@/components/ui/sonner';
|
|
import './index.css';
|
|
import App from './App';
|
|
|
|
createRoot(document.getElementById('root')!).render(
|
|
<StrictMode>
|
|
<ThemeProvider>
|
|
<QueryClientProvider client={queryClient}>
|
|
<App />
|
|
<Toaster />
|
|
</QueryClientProvider>
|
|
</ThemeProvider>
|
|
</StrictMode>,
|
|
);
|
|
|
|
if ('serviceWorker' in navigator && import.meta.env.PROD) {
|
|
window.addEventListener('load', () => {
|
|
navigator.serviceWorker.register('/sw.js').catch(() => {
|
|
// Installability is a progressive enhancement; ignore failures
|
|
});
|
|
});
|
|
}
|