mirror of
https://dev.azure.com/tstanciu94/PhantomMind/_git/Bitip
synced 2025-10-13 01:52:19 +03:00
Compare commits
3 Commits
ee20b85c9e
...
07412e620d
Author | SHA1 | Date | |
---|---|---|---|
|
07412e620d | ||
|
d24f8942dd | ||
|
30171365b3 |
@ -76,9 +76,8 @@ RUN npm ci --only=production --workspace=bitip-backend && \
|
|||||||
# Copy built artifacts from builder
|
# Copy built artifacts from builder
|
||||||
COPY --from=builder /app/dist ./dist
|
COPY --from=builder /app/dist ./dist
|
||||||
|
|
||||||
# Copy configuration files needed at runtime
|
# Copy content files needed at runtime
|
||||||
COPY --from=builder /app/ReleaseNotes.json ./
|
COPY --from=builder /app/content ./content
|
||||||
COPY --from=builder /app/Overview.json ./
|
|
||||||
|
|
||||||
# Create directory for MaxMind databases
|
# Create directory for MaxMind databases
|
||||||
RUN mkdir -p /usr/share/maxmind && \
|
RUN mkdir -p /usr/share/maxmind && \
|
||||||
|
@ -1,5 +1,47 @@
|
|||||||
{
|
{
|
||||||
"releases": [
|
"releases": [
|
||||||
|
{
|
||||||
|
"version": "1.0.2",
|
||||||
|
"date": "2025-10-05T15:00:00Z",
|
||||||
|
"title": "External Resources & Links",
|
||||||
|
"summary": "Added external resource links in the UI footer for easy access to repository, documentation, Docker registry, and client libraries.",
|
||||||
|
"sections": [
|
||||||
|
{
|
||||||
|
"title": "Overview",
|
||||||
|
"content": "Version 1.0.2 enhances the user interface by adding quick access links to external resources. Users can now easily navigate to the source code repository, documentation, Docker registry, and official client libraries directly from the application footer."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "UI Enhancements",
|
||||||
|
"items": [
|
||||||
|
"**Resource Links Footer** - Added prominent footer section with external resource links",
|
||||||
|
"**Icon-based Navigation** - Each link includes relevant emoji icon for visual identification",
|
||||||
|
"**Hover Effects** - Smooth hover animations with background highlight and lift effect",
|
||||||
|
"**Responsive Layout** - Links wrap gracefully on smaller screens",
|
||||||
|
"**Clean Design** - Subtle styling that complements existing footer aesthetic"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Available Resources",
|
||||||
|
"items": [
|
||||||
|
"**📦 Repository** - Source code hosted on Gitea (lab.code-rove.com)",
|
||||||
|
"**📖 Documentation** - Comprehensive README and project documentation",
|
||||||
|
"**🐳 Docker** - Official Docker images on ProGet container registry",
|
||||||
|
"**📦 NuGet** - .NET client library for C# applications",
|
||||||
|
"**📦 NPM** - JavaScript/TypeScript client library (@flare/bitip-client)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Technical Details",
|
||||||
|
"items": [
|
||||||
|
"Added `.footer-links` CSS class with flexbox layout",
|
||||||
|
"Implemented smooth hover transitions with `transform` and `background` effects",
|
||||||
|
"Links open in new tab with `target=\"_blank\"` and security attributes",
|
||||||
|
"Added descriptive `title` attributes for accessibility",
|
||||||
|
"Maintained consistent spacing and typography with existing footer"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"date": "2025-10-05T02:29:00Z",
|
"date": "2025-10-05T02:29:00Z",
|
18
package-lock.json
generated
18
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "bitip",
|
"name": "bitip",
|
||||||
"version": "1.0.0",
|
"version": "1.0.2",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "bitip",
|
"name": "bitip",
|
||||||
"version": "1.0.0",
|
"version": "1.0.2",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"src/backend",
|
"src/backend",
|
||||||
@ -4224,6 +4224,15 @@
|
|||||||
"node": "20 || >=22"
|
"node": "20 || >=22"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/lucide-react": {
|
||||||
|
"version": "0.544.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.544.0.tgz",
|
||||||
|
"integrity": "sha512-t5tS44bqd825zAW45UQxpG2CvcC4urOwn2TrwSH8u+MjeE+1NnWl6QqeQ/6NdjMqdOygyiT9p3Ev0p1NJykxjw==",
|
||||||
|
"license": "ISC",
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/magic-string": {
|
"node_modules/magic-string": {
|
||||||
"version": "0.30.19",
|
"version": "0.30.19",
|
||||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz",
|
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz",
|
||||||
@ -6637,7 +6646,7 @@
|
|||||||
},
|
},
|
||||||
"src/backend": {
|
"src/backend": {
|
||||||
"name": "bitip-backend",
|
"name": "bitip-backend",
|
||||||
"version": "1.0.0",
|
"version": "1.0.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@maxmind/geoip2-node": "^6.1.0",
|
"@maxmind/geoip2-node": "^6.1.0",
|
||||||
"compression": "^1.7.4",
|
"compression": "^1.7.4",
|
||||||
@ -7126,10 +7135,11 @@
|
|||||||
},
|
},
|
||||||
"src/frontend": {
|
"src/frontend": {
|
||||||
"name": "bitip-frontend",
|
"name": "bitip-frontend",
|
||||||
"version": "1.0.0",
|
"version": "1.0.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.12.2",
|
"axios": "^1.12.2",
|
||||||
"leaflet": "^1.9.4",
|
"leaflet": "^1.9.4",
|
||||||
|
"lucide-react": "^0.544.0",
|
||||||
"react": "^19.1.1",
|
"react": "^19.1.1",
|
||||||
"react-dom": "^19.1.1",
|
"react-dom": "^19.1.1",
|
||||||
"react-leaflet": "^5.0.0",
|
"react-leaflet": "^5.0.0",
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "bitip",
|
"name": "bitip",
|
||||||
"version": "1.0.1",
|
"version": "1.0.2",
|
||||||
"description": "Bitip - GeoIP Lookup Service with REST API and Web Interface",
|
"description": "Bitip - GeoIP Lookup Service with REST API and Web Interface",
|
||||||
"main": "dist/backend/index.js",
|
"main": "dist/backend/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "concurrently \"npm run dev:backend\" \"npm run dev:frontend\"",
|
"dev": "concurrently \"npm run dev:backend\" \"npm run dev:frontend\"",
|
||||||
|
"dev:debug": "concurrently \"npm run dev:backend:debug\" \"npm run dev:frontend\"",
|
||||||
"dev:backend": "cd src/backend && npm run dev",
|
"dev:backend": "cd src/backend && npm run dev",
|
||||||
|
"dev:backend:debug": "cd src/backend && npm run dev:debug",
|
||||||
"dev:frontend": "cd src/frontend && npm run dev",
|
"dev:frontend": "cd src/frontend && npm run dev",
|
||||||
"build": "npm run build:backend && npm run build:frontend",
|
"build": "npm run build:backend && npm run build:frontend",
|
||||||
"build:backend": "cd src/backend && npm run build",
|
"build:backend": "cd src/backend && npm run build",
|
||||||
|
11
src/backend/nodemon-debug.json
Normal file
11
src/backend/nodemon-debug.json
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"watch": ["."],
|
||||||
|
"ext": "ts,json",
|
||||||
|
"ignore": ["**/*.spec.ts", "**/*.test.ts", "node_modules", "dist"],
|
||||||
|
"exec": "node --inspect --import ./register.js index.ts",
|
||||||
|
"delay": 1000,
|
||||||
|
"env": {
|
||||||
|
"NODE_ENV": "development",
|
||||||
|
"NODE_OPTIONS": "--experimental-specifier-resolution=node"
|
||||||
|
}
|
||||||
|
}
|
@ -1,11 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "bitip-backend",
|
"name": "bitip-backend",
|
||||||
"version": "1.0.1",
|
"version": "1.0.2",
|
||||||
"description": "Bitip Backend - GeoIP REST API Service",
|
"description": "Bitip Backend - GeoIP REST API Service",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "nodemon",
|
"dev": "nodemon",
|
||||||
|
"dev:debug": "nodemon --config nodemon-debug.json",
|
||||||
"build": "tsup",
|
"build": "tsup",
|
||||||
"start": "node dist/index.js",
|
"start": "node dist/index.js",
|
||||||
"lint": "eslint .",
|
"lint": "eslint .",
|
||||||
|
@ -29,8 +29,8 @@ const resolveFilePath = (...relativePath: string[]): string => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const envPath = resolveFilePath('.env');
|
const envPath = resolveFilePath('.env');
|
||||||
const releaseNotesPath = resolveFilePath('ReleaseNotes.json');
|
const releaseNotesPath = resolveFilePath('content', 'ReleaseNotes.json');
|
||||||
const overviewPath = resolveFilePath('Overview.json');
|
const overviewPath = resolveFilePath('content', 'Overview.json');
|
||||||
const frontendPrefix = isProduction ? 'dist' : 'src';
|
const frontendPrefix = isProduction ? 'dist' : 'src';
|
||||||
const frontendPath = resolveFilePath(frontendPrefix, 'frontend');
|
const frontendPath = resolveFilePath(frontendPrefix, 'frontend');
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "bitip-frontend",
|
"name": "bitip-frontend",
|
||||||
"version": "1.0.0",
|
"version": "1.0.2",
|
||||||
"description": "Bitip Frontend - GeoIP Web Interface",
|
"description": "Bitip Frontend - GeoIP Web Interface",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -14,6 +14,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.12.2",
|
"axios": "^1.12.2",
|
||||||
"leaflet": "^1.9.4",
|
"leaflet": "^1.9.4",
|
||||||
|
"lucide-react": "^0.544.0",
|
||||||
"react": "^19.1.1",
|
"react": "^19.1.1",
|
||||||
"react-dom": "^19.1.1",
|
"react-dom": "^19.1.1",
|
||||||
"react-leaflet": "^5.0.0",
|
"react-leaflet": "^5.0.0",
|
||||||
|
@ -27,9 +27,22 @@ body {
|
|||||||
background: rgba(255, 255, 255, 0.1);
|
background: rgba(255, 255, 255, 0.1);
|
||||||
backdrop-filter: blur(10px);
|
backdrop-filter: blur(10px);
|
||||||
color: white;
|
color: white;
|
||||||
text-align: center;
|
|
||||||
padding: 2rem 1rem;
|
padding: 2rem 1rem;
|
||||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header > .external-links {
|
||||||
|
position: absolute;
|
||||||
|
top: 1rem;
|
||||||
|
right: 1rem;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-content {
|
||||||
|
text-align: center;
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header h1 {
|
.header h1 {
|
||||||
@ -42,7 +55,7 @@ body {
|
|||||||
.header p {
|
.header p {
|
||||||
font-size: 1.2rem;
|
font-size: 1.2rem;
|
||||||
opacity: 0.9;
|
opacity: 0.9;
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Navigation */
|
/* Navigation */
|
||||||
@ -111,6 +124,11 @@ body {
|
|||||||
|
|
||||||
/* Responsive Design */
|
/* Responsive Design */
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
|
.header > .external-links {
|
||||||
|
top: 0.5rem;
|
||||||
|
right: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
.header h1 {
|
.header h1 {
|
||||||
font-size: 2.5rem;
|
font-size: 2.5rem;
|
||||||
}
|
}
|
||||||
@ -127,4 +145,8 @@ body {
|
|||||||
padding: 0.5rem 1rem;
|
padding: 0.5rem 1rem;
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.external-links {
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ import { Routes, Route, NavLink } from 'react-router-dom';
|
|||||||
import Home from './pages/Home.js';
|
import Home from './pages/Home.js';
|
||||||
import Overview from './pages/Overview.js';
|
import Overview from './pages/Overview.js';
|
||||||
import ReleaseNotes from './pages/ReleaseNotes.js';
|
import ReleaseNotes from './pages/ReleaseNotes.js';
|
||||||
|
import ExternalLinks from './components/ExternalLinks.js';
|
||||||
import BitipAPI from './services/api.js';
|
import BitipAPI from './services/api.js';
|
||||||
import './App.css';
|
import './App.css';
|
||||||
|
|
||||||
@ -33,8 +34,11 @@ const App: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<div className="app">
|
<div className="app">
|
||||||
<header className="header">
|
<header className="header">
|
||||||
<h1>🌍 Bitip</h1>
|
<ExternalLinks />
|
||||||
<p>Professional GeoIP Lookup Service</p>
|
<div className="header-content">
|
||||||
|
<h1>🌍 Bitip</h1>
|
||||||
|
<p>Professional GeoIP Lookup Service</p>
|
||||||
|
</div>
|
||||||
<nav className="nav">
|
<nav className="nav">
|
||||||
<NavLink
|
<NavLink
|
||||||
to="/"
|
to="/"
|
||||||
|
26
src/frontend/src/components/ExternalLinks.css
Normal file
26
src/frontend/src/components/ExternalLinks.css
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
.external-links {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.external-link {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
padding: 0.4rem;
|
||||||
|
border-radius: 6px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.external-link:hover {
|
||||||
|
color: rgba(255, 255, 255, 1);
|
||||||
|
background: rgba(255, 255, 255, 0.1);
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.external-link svg {
|
||||||
|
display: block;
|
||||||
|
}
|
63
src/frontend/src/components/ExternalLinks.tsx
Normal file
63
src/frontend/src/components/ExternalLinks.tsx
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import {
|
||||||
|
Github,
|
||||||
|
BookOpen,
|
||||||
|
Container,
|
||||||
|
Package,
|
||||||
|
PackageOpen,
|
||||||
|
} from 'lucide-react';
|
||||||
|
import './ExternalLinks.css';
|
||||||
|
|
||||||
|
const ExternalLinks: React.FC = () => {
|
||||||
|
return (
|
||||||
|
<div className="external-links">
|
||||||
|
<a
|
||||||
|
href="https://lab.code-rove.com/gitea/tudor.stanciu/bitip"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
title="Source Code Repository"
|
||||||
|
className="external-link"
|
||||||
|
>
|
||||||
|
<Github size={20} />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://lab.code-rove.com/gitea/tudor.stanciu/bitip#readme"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
title="Documentation"
|
||||||
|
className="external-link"
|
||||||
|
>
|
||||||
|
<BookOpen size={20} />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://proget.code-rove.com/containers/repositories/stable-registry/bitip/overview"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
title="Docker Registry"
|
||||||
|
className="external-link"
|
||||||
|
>
|
||||||
|
<Container size={20} />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://lab.code-rove.com/public-nuget-server/packages/bitip.client"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
title="NuGet Client Library"
|
||||||
|
className="external-link"
|
||||||
|
>
|
||||||
|
<Package size={20} />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://lab.code-rove.com/public-node-registry/-/web/detail/@flare/bitip-client"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
title="NPM Client Library"
|
||||||
|
className="external-link"
|
||||||
|
>
|
||||||
|
<PackageOpen size={20} />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ExternalLinks;
|
Loading…
x
Reference in New Issue
Block a user