Merge pull request 'feat(cannaiq): Add clickable logo, favicon, and remove state selector' (#45) from feat/cannaiq-ui-polish into master

Reviewed-on: https://code.cannabrands.app/Creationshop/dispensary-scraper/pulls/45
This commit is contained in:
kelly
2025-12-12 03:36:04 +00:00
5 changed files with 38 additions and 32 deletions

View File

@@ -1,46 +1,38 @@
steps: steps:
# =========================================== # ===========================================
# PR VALIDATION: Parallel type checks (PRs only) # PR VALIDATION: Only typecheck changed projects
# =========================================== # ===========================================
typecheck-backend: typecheck-backend:
image: code.cannabrands.app/creationshop/node:20 image: code.cannabrands.app/creationshop/node:20
commands: commands:
- npm config set cache /npm-cache/backend --global
- cd backend - cd backend
- npm ci --prefer-offline - npm ci --prefer-offline
- npx tsc --noEmit - npx tsc --noEmit
volumes:
- npm-cache:/npm-cache
depends_on: [] depends_on: []
when: when:
event: pull_request event: pull_request
path:
include: ['backend/**']
typecheck-cannaiq: typecheck-cannaiq:
image: code.cannabrands.app/creationshop/node:20 image: code.cannabrands.app/creationshop/node:20
commands: commands:
- npm config set cache /npm-cache/cannaiq --global
- cd cannaiq - cd cannaiq
- npm ci --prefer-offline - npm ci --prefer-offline
- npx tsc --noEmit - npx tsc --noEmit
volumes:
- npm-cache:/npm-cache
depends_on: [] depends_on: []
when: when:
event: pull_request event: pull_request
path:
include: ['cannaiq/**']
typecheck-findadispo: # findadispo/findagram typechecks skipped - they have || true anyway
image: code.cannabrands.app/creationshop/node:20
commands:
- cd findadispo/frontend
- npm ci --prefer-offline
- npx tsc --noEmit 2>/dev/null || true
depends_on: []
when:
event: pull_request
typecheck-findagram:
image: code.cannabrands.app/creationshop/node:20
commands:
- cd findagram/frontend
- npm ci --prefer-offline
- npx tsc --noEmit 2>/dev/null || true
depends_on: []
when:
event: pull_request
# =========================================== # ===========================================
# AUTO-MERGE: Merge PR after all checks pass # AUTO-MERGE: Merge PR after all checks pass
@@ -62,8 +54,6 @@ steps:
depends_on: depends_on:
- typecheck-backend - typecheck-backend
- typecheck-cannaiq - typecheck-cannaiq
- typecheck-findadispo
- typecheck-findagram
when: when:
event: pull_request event: pull_request

View File

@@ -2,7 +2,7 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CannaIQ - Cannabis Menu Intelligence Platform</title> <title>CannaIQ - Cannabis Menu Intelligence Platform</title>
<meta name="description" content="CannaIQ provides real-time cannabis dispensary menu data, product tracking, and analytics for dispensaries across Arizona." /> <meta name="description" content="CannaIQ provides real-time cannabis dispensary menu data, product tracking, and analytics for dispensaries across Arizona." />

View File

@@ -0,0 +1,5 @@
<svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<rect width="32" height="32" rx="6" fill="#059669"/>
<path d="M16 6C12.5 6 9.5 7.5 7.5 10L16 16L24.5 10C22.5 7.5 19.5 6 16 6Z" fill="white"/>
<path d="M7.5 10C6 12 5 14.5 5 17C5 22.5 10 26 16 26C22 26 27 22.5 27 17C27 14.5 26 12 24.5 10L16 16L7.5 10Z" fill="white" fill-opacity="0.7"/>
</svg>

After

Width:  |  Height:  |  Size: 360 B

View File

@@ -2,7 +2,6 @@ import { ReactNode, useEffect, useState, useRef } from 'react';
import { useNavigate, useLocation, Link } from 'react-router-dom'; import { useNavigate, useLocation, Link } from 'react-router-dom';
import { useAuthStore } from '../store/authStore'; import { useAuthStore } from '../store/authStore';
import { api } from '../lib/api'; import { api } from '../lib/api';
import { StateSelector } from './StateSelector';
import { import {
LayoutDashboard, LayoutDashboard,
Building2, Building2,
@@ -140,7 +139,7 @@ export function Layout({ children }: LayoutProps) {
<> <>
{/* Logo/Brand */} {/* Logo/Brand */}
<div className="px-6 py-5 border-b border-gray-200"> <div className="px-6 py-5 border-b border-gray-200">
<div className="flex items-center gap-3"> <Link to="/dashboard" className="flex items-center gap-3 hover:opacity-80 transition-opacity">
<div className="w-8 h-8 bg-emerald-600 rounded-lg flex items-center justify-center"> <div className="w-8 h-8 bg-emerald-600 rounded-lg flex items-center justify-center">
<svg viewBox="0 0 24 24" className="w-5 h-5 text-white" fill="currentColor"> <svg viewBox="0 0 24 24" className="w-5 h-5 text-white" fill="currentColor">
<path d="M12 2C8.5 2 5.5 3.5 3.5 6L12 12L20.5 6C18.5 3.5 15.5 2 12 2Z" /> <path d="M12 2C8.5 2 5.5 3.5 3.5 6L12 12L20.5 6C18.5 3.5 15.5 2 12 2Z" />
@@ -155,14 +154,10 @@ export function Layout({ children }: LayoutProps) {
</p> </p>
)} )}
</div> </div>
</div> </Link>
<p className="text-xs text-gray-500 mt-2 truncate">{user?.email}</p> <p className="text-xs text-gray-500 mt-2 truncate">{user?.email}</p>
</div> </div>
{/* State Selector */}
<div className="px-4 py-3 border-b border-gray-200 bg-gray-50">
<StateSelector showLabel={false} />
</div>
{/* Navigation */} {/* Navigation */}
<nav ref={navRef} className="flex-1 px-3 py-4 space-y-6 overflow-y-auto"> <nav ref={navRef} className="flex-1 px-3 py-4 space-y-6 overflow-y-auto">
@@ -233,7 +228,7 @@ export function Layout({ children }: LayoutProps) {
<button onClick={() => setSidebarOpen(true)} className="p-2 -ml-2 rounded-lg hover:bg-gray-100"> <button onClick={() => setSidebarOpen(true)} className="p-2 -ml-2 rounded-lg hover:bg-gray-100">
<Menu className="w-5 h-5 text-gray-600" /> <Menu className="w-5 h-5 text-gray-600" />
</button> </button>
<div className="flex items-center gap-2"> <Link to="/dashboard" className="flex items-center gap-2 hover:opacity-80 transition-opacity">
<div className="w-6 h-6 bg-emerald-600 rounded flex items-center justify-center"> <div className="w-6 h-6 bg-emerald-600 rounded flex items-center justify-center">
<svg viewBox="0 0 24 24" className="w-4 h-4 text-white" fill="currentColor"> <svg viewBox="0 0 24 24" className="w-4 h-4 text-white" fill="currentColor">
<path d="M12 2C8.5 2 5.5 3.5 3.5 6L12 12L20.5 6C18.5 3.5 15.5 2 12 2Z" /> <path d="M12 2C8.5 2 5.5 3.5 3.5 6L12 12L20.5 6C18.5 3.5 15.5 2 12 2Z" />
@@ -241,7 +236,7 @@ export function Layout({ children }: LayoutProps) {
</svg> </svg>
</div> </div>
<span className="font-semibold text-gray-900">CannaIQ</span> <span className="font-semibold text-gray-900">CannaIQ</span>
</div> </Link>
</div> </div>
{/* Page content */} {/* Page content */}

View File

@@ -6,6 +6,19 @@ kind: Namespace
metadata: metadata:
name: woodpecker name: woodpecker
--- ---
# PVC for npm cache - shared across CI jobs
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: npm-cache
namespace: woodpecker
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
---
apiVersion: v1 apiVersion: v1
kind: Secret kind: Secret
metadata: metadata:
@@ -52,6 +65,9 @@ spec:
value: "woodpecker" value: "woodpecker"
- name: WOODPECKER_BACKEND_K8S_VOLUME_SIZE - name: WOODPECKER_BACKEND_K8S_VOLUME_SIZE
value: "10G" value: "10G"
# Allow CI steps to mount the npm-cache PVC
- name: WOODPECKER_BACKEND_K8S_VOLUMES
value: "npm-cache:/npm-cache"
resources: resources:
limits: limits:
memory: "512Mi" memory: "512Mi"