Spaces:
Running
Running
Add metadata
Browse files- .dockerignore +8 -0
- Dockerfile +32 -0
- README.md +23 -0
- nginx.conf +25 -0
- src/components/Header.tsx +13 -1
- src/pages/Calendar.tsx +16 -1
.dockerignore
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
node_modules
|
2 |
+
dist
|
3 |
+
.git
|
4 |
+
.gitignore
|
5 |
+
.env
|
6 |
+
.env.*
|
7 |
+
*.log
|
8 |
+
README.md
|
Dockerfile
ADDED
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Build stage
|
2 |
+
FROM node:20-slim AS builder
|
3 |
+
|
4 |
+
# Set working directory
|
5 |
+
WORKDIR /app
|
6 |
+
|
7 |
+
# Copy package files
|
8 |
+
COPY package*.json ./
|
9 |
+
|
10 |
+
# Install dependencies
|
11 |
+
RUN npm install
|
12 |
+
|
13 |
+
# Copy project files
|
14 |
+
COPY . .
|
15 |
+
|
16 |
+
# Build the app
|
17 |
+
RUN npm run build
|
18 |
+
|
19 |
+
# Production stage
|
20 |
+
FROM nginx:alpine
|
21 |
+
|
22 |
+
# Copy built assets from builder stage
|
23 |
+
COPY --from=builder /app/dist /usr/share/nginx/html
|
24 |
+
|
25 |
+
# Copy nginx configuration
|
26 |
+
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
27 |
+
|
28 |
+
# Expose port 7860 (default for Hugging Face Spaces)
|
29 |
+
EXPOSE 7860
|
30 |
+
|
31 |
+
# Start nginx
|
32 |
+
CMD ["nginx", "-g", "daemon off;"]
|
README.md
CHANGED
@@ -1,3 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
# Welcome to your Lovable project
|
2 |
|
3 |
## Project info
|
@@ -67,3 +76,17 @@ Simply open [Lovable](https://lovable.dev/projects/5c0b5f16-c917-4e43-9d0c-03c32
|
|
67 |
## I want to use a custom domain - is that possible?
|
68 |
|
69 |
We don't support custom domains (yet). If you want to deploy your project under your own domain then we recommend using Netlify. Visit our docs for more details: [Custom domains](https://docs.lovable.dev/tips-tricks/custom-domain/)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: AI Deadlines
|
3 |
+
emoji: ⚡
|
4 |
+
colorFrom: gray
|
5 |
+
colorTo: blue
|
6 |
+
sdk: docker
|
7 |
+
pinned: false
|
8 |
+
---
|
9 |
+
|
10 |
# Welcome to your Lovable project
|
11 |
|
12 |
## Project info
|
|
|
76 |
## I want to use a custom domain - is that possible?
|
77 |
|
78 |
We don't support custom domains (yet). If you want to deploy your project under your own domain then we recommend using Netlify. Visit our docs for more details: [Custom domains](https://docs.lovable.dev/tips-tricks/custom-domain/)
|
79 |
+
|
80 |
+
## Deploy with Docker
|
81 |
+
|
82 |
+
First build the Docker image as follows:
|
83 |
+
|
84 |
+
```bash
|
85 |
+
docker build -t ai-deadlines .
|
86 |
+
```
|
87 |
+
|
88 |
+
Next it can be run as follows:
|
89 |
+
|
90 |
+
```bash
|
91 |
+
docker run -it -p 7860:7860 ai-deadlines
|
92 |
+
```
|
nginx.conf
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
server {
|
2 |
+
listen 7860;
|
3 |
+
server_name _;
|
4 |
+
root /usr/share/nginx/html;
|
5 |
+
index index.html;
|
6 |
+
|
7 |
+
# Enable gzip compression
|
8 |
+
gzip on;
|
9 |
+
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
|
10 |
+
|
11 |
+
location / {
|
12 |
+
try_files $uri $uri/ /index.html;
|
13 |
+
}
|
14 |
+
|
15 |
+
# Cache static assets
|
16 |
+
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
|
17 |
+
expires 30d;
|
18 |
+
add_header Cache-Control "public, no-transform";
|
19 |
+
}
|
20 |
+
|
21 |
+
# Security headers
|
22 |
+
add_header X-Frame-Options "SAMEORIGIN";
|
23 |
+
add_header X-XSS-Protection "1; mode=block";
|
24 |
+
add_header X-Content-Type-Options "nosniff";
|
25 |
+
}
|
src/components/Header.tsx
CHANGED
@@ -1,4 +1,3 @@
|
|
1 |
-
|
2 |
import { Search } from "lucide-react";
|
3 |
import { Input } from "@/components/ui/input";
|
4 |
import { Link } from "react-router-dom";
|
@@ -48,6 +47,19 @@ const Header = ({ onSearch }: HeaderProps) => {
|
|
48 |
</div>
|
49 |
</div>
|
50 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
51 |
</div>
|
52 |
</header>
|
53 |
);
|
|
|
|
|
1 |
import { Search } from "lucide-react";
|
2 |
import { Input } from "@/components/ui/input";
|
3 |
import { Link } from "react-router-dom";
|
|
|
47 |
</div>
|
48 |
</div>
|
49 |
</div>
|
50 |
+
<div className="max-w-4xl mx-auto text-center">
|
51 |
+
<p className="text-sm text-neutral-600 py-4">
|
52 |
+
Countdowns to top CV/NLP/ML/Robotics/AI conference deadlines. To add/edit a conference, send in a{' '}
|
53 |
+
<a
|
54 |
+
href="https://github.com/NielsRogge/ai-deadlines-hub"
|
55 |
+
target="_blank"
|
56 |
+
rel="noopener noreferrer"
|
57 |
+
className="text-primary hover:underline"
|
58 |
+
>
|
59 |
+
pull request
|
60 |
+
</a>.
|
61 |
+
</p>
|
62 |
+
</div>
|
63 |
</div>
|
64 |
</header>
|
65 |
);
|
src/pages/Calendar.tsx
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
import { useState } from "react";
|
2 |
import conferencesData from "@/data/conferences.yml";
|
3 |
import { Conference } from "@/types/conference";
|
4 |
-
import { Calendar as CalendarIcon, Tag, X } from "lucide-react"; // Added X
|
5 |
import { Calendar } from "@/components/ui/calendar";
|
6 |
import { parseISO, format, isValid, isSameMonth, isSameYear, isSameDay, isSameWeek } from "date-fns";
|
7 |
import { Toggle } from "@/components/ui/toggle";
|
@@ -444,6 +444,21 @@ const CalendarPage = () => {
|
|
444 |
</TooltipProvider>
|
445 |
))}
|
446 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
447 |
{selectedCategories.size > 0 && (
|
448 |
<button
|
449 |
onClick={() => {
|
|
|
1 |
import { useState } from "react";
|
2 |
import conferencesData from "@/data/conferences.yml";
|
3 |
import { Conference } from "@/types/conference";
|
4 |
+
import { Calendar as CalendarIcon, Tag, X, Plus } from "lucide-react"; // Added X and Plus imports
|
5 |
import { Calendar } from "@/components/ui/calendar";
|
6 |
import { parseISO, format, isValid, isSameMonth, isSameYear, isSameDay, isSameWeek } from "date-fns";
|
7 |
import { Toggle } from "@/components/ui/toggle";
|
|
|
444 |
</TooltipProvider>
|
445 |
))}
|
446 |
|
447 |
+
{selectedCategories.size < Object.keys(categoryColors).length && (
|
448 |
+
<button
|
449 |
+
onClick={() => {
|
450 |
+
setSelectedCategories(new Set(Object.keys(categoryColors)));
|
451 |
+
setShowDeadlines(true);
|
452 |
+
}}
|
453 |
+
className="text-sm text-green-600 bg-green-50 hover:bg-green-100 hover:text-green-700
|
454 |
+
px-3 py-1.5 rounded-lg border border-green-200
|
455 |
+
transition-colors flex items-center gap-2"
|
456 |
+
>
|
457 |
+
<Plus className="h-4 w-4" />
|
458 |
+
Select All
|
459 |
+
</button>
|
460 |
+
)}
|
461 |
+
|
462 |
{selectedCategories.size > 0 && (
|
463 |
<button
|
464 |
onClick={() => {
|