Compare commits

...

15 Commits

Author SHA1 Message Date
nomadjimbob
43abc6d1c6 Dependency update 2025-12-31 20:59:17 +00:00
James Collins
d9fc6c95f3 Update PHP version in dependency update workflow 2026-01-01 06:58:23 +10:00
James Collins
a65f0eead6 Add workflow for automated dependency updates 2026-01-01 06:56:13 +10:00
ca025ca2e8 dependency updates 2025-12-23 10:39:55 +10:00
74aef68edc remove posts reference 2025-12-23 10:34:05 +10:00
c0e595f88a dependency updates 2025-11-27 10:15:26 +10:00
aab4bc0d46 dependency updates 2025-11-26 10:10:57 +10:00
f2708e1325 dependency updates 2025-11-19 10:32:18 +10:00
James Collins
2e2b70ab7c Merge pull request #533 from STEMMechanics/dependabot/npm_and_yarn/multi-74f7c1f85a
Bump esbuild and vite
2025-11-19 10:28:45 +10:00
dependabot[bot]
e42d54554a Bump esbuild and vite
Bumps [esbuild](https://github.com/evanw/esbuild) to 0.25.12 and updates ancestor dependency [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). These dependencies need to be updated together.


Updates `esbuild` from 0.21.5 to 0.25.12
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG-2024.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.21.5...v0.25.12)

Updates `vite` from 5.4.21 to 7.2.2
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.2.2/packages/vite)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-version: 0.25.12
  dependency-type: indirect
- dependency-name: vite
  dependency-version: 7.2.2
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-19 00:25:53 +00:00
6cb24f1500 dependency updates 2025-11-19 10:24:23 +10:00
f7cc086f37 added jenkins link 2025-11-19 10:23:05 +10:00
8463da7842 opacity fixes 2025-11-17 09:26:48 +10:00
James Collins
322d547c92 Merge pull request #526 from STEMMechanics/laravel12
laravel 12 upgrade
2025-11-17 09:09:10 +10:00
30104ece71 laravel 12 upgrade 2025-11-17 09:08:07 +10:00
14 changed files with 1768 additions and 2284 deletions

55
.github/workflows/dependency-update.yml vendored Normal file
View File

@@ -0,0 +1,55 @@
name: Dependency Update
on:
schedule:
- cron: "0 20 * * 1" # Mondays 20:00 UTC
workflow_dispatch: {}
permissions:
contents: write
pull-requests: write
jobs:
update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- uses: shivammathur/setup-php@v2
with:
php-version: "8.4"
tools: composer:v2
- name: Install current deps
run: |
npm ci
composer install --no-interaction --no-progress
- name: Update deps
run: |
npm update
composer update --no-interaction --no-progress
- name: Detect changes
id: changes
run: |
if git diff --quiet; then
echo "changed=false" >> "$GITHUB_OUTPUT"
else
echo "changed=true" >> "$GITHUB_OUTPUT"
fi
- name: Create PR
if: steps.changes.outputs.changed == 'true'
uses: peter-evans/create-pull-request@v6
with:
commit-message: "Dependency update"
title: "Dependency update"
body: "Automated dependency update."
branch: "bot/dependency-update"
delete-branch: true

View File

@@ -34,23 +34,23 @@ class SearchController extends Controller
$workshops = $workshopQuery->orderBy('starts_at', 'desc') $workshops = $workshopQuery->orderBy('starts_at', 'desc')
->paginate(6, ['*'], 'workshop'); ->paginate(6, ['*'], 'workshop');
$postQuery = Post::query()->where('status', 'published'); // $postQuery = Post::query()->where('status', 'published');
$postQuery->where(function ($query) use ($search_words) { // $postQuery->where(function ($query) use ($search_words) {
foreach ($search_words as $word) { // foreach ($search_words as $word) {
$query->where(function ($subQuery) use ($word) { // $query->where(function ($subQuery) use ($word) {
$subQuery->where('title', 'like', '%' . $word . '%') // $subQuery->where('title', 'like', '%' . $word . '%')
->orWhere('content', 'like', '%' . $word . '%'); // ->orWhere('content', 'like', '%' . $word . '%');
}); // });
} // }
}); // });
//
$posts = $postQuery->orderBy('created_at', 'desc') // $posts = $postQuery->orderBy('created_at', 'desc')
->paginate(6, ['*'], 'post') // ->paginate(6, ['*'], 'post')
->onEachSide(1); // ->onEachSide(1);
return view('search', [ return view('search', [
'workshops' => $workshops, 'workshops' => $workshops,
'posts' => $posts, // 'posts' => $posts,
'search' => $search, 'search' => $search,
]); ]);
} }

View File

@@ -10,7 +10,7 @@
"chillerlan/php-qrcode": "^5.0", "chillerlan/php-qrcode": "^5.0",
"gehrisandro/tailwind-merge-laravel": "^1.2", "gehrisandro/tailwind-merge-laravel": "^1.2",
"intervention/image": "^3.5", "intervention/image": "^3.5",
"laravel/framework": "^11.0", "laravel/framework": "^12.0",
"laravel/tinker": "^2.9", "laravel/tinker": "^2.9",
"livewire/livewire": "^3.4", "livewire/livewire": "^3.4",
"php-ffmpeg/php-ffmpeg": "^1.2", "php-ffmpeg/php-ffmpeg": "^1.2",
@@ -22,7 +22,6 @@
"laravel/pint": "^1.13", "laravel/pint": "^1.13",
"laravel/sail": "^1.26", "laravel/sail": "^1.26",
"mockery/mockery": "^1.6", "mockery/mockery": "^1.6",
"nunomaduro/collision": "^8.0",
"phpunit/phpunit": "^10.5", "phpunit/phpunit": "^10.5",
"spatie/laravel-ignition": "^2.4" "spatie/laravel-ignition": "^2.4"
}, },

1361
composer.lock generated

File diff suppressed because it is too large Load Diff

2487
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -6,12 +6,12 @@
"build": "vite build" "build": "vite build"
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/vite": "^4.1.17",
"autoprefixer": "^10.4.19", "autoprefixer": "^10.4.19",
"axios": "^1.6.4", "axios": "^1.6.4",
"laravel-vite-plugin": "^1.0", "laravel-vite-plugin": "^1.0",
"postcss": "^8.4.38", "postcss": "^8.4.38",
"tailwindcss": "^3.4.3", "vite": "^6.4"
"vite": "^5.0"
}, },
"dependencies": { "dependencies": {
"@tiptap/core": "^2.3.0", "@tiptap/core": "^2.3.0",
@@ -24,6 +24,7 @@
"@tiptap/extension-typography": "^2.3.0", "@tiptap/extension-typography": "^2.3.0",
"@tiptap/extension-underline": "^2.3.0", "@tiptap/extension-underline": "^2.3.0",
"@tiptap/pm": "^2.3.0", "@tiptap/pm": "^2.3.0",
"@tiptap/starter-kit": "^2.3.0" "@tiptap/starter-kit": "^2.3.0",
"tailwindcss": "^4.1.17"
} }
} }

View File

@@ -1,6 +0,0 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

View File

@@ -1,6 +1,24 @@
@tailwind base; @import "tailwindcss";
@tailwind components;
@tailwind utilities; @source "../**/*.{blade.php,js,php,vue}";
@theme {
/* Color tokens */
--color-primary-color: #0284C7;
--color-primary-color-dark: #0370A1;
--color-primary-color-light: #0EA5E9;
--color-danger-color: #b91c1c;
--color-danger-color-dark: #991b1b;
--color-danger-color-light: #dc2626;
--color-success-color: #16a34a;
--color-success-color-dark: #22c55e;
--color-success-color-light: #4ade80;
/* Box shadows */
--shadow-deep: 0 10px 15px rgba(0, 0, 0, 0.5);
}
html, body { html, body {
@apply bg-gray-100; @apply bg-gray-100;

View File

@@ -7,6 +7,7 @@
<li><a href="https://discord.gg/yNzk4x7mpD" class="text-sm hover:text-primary-color">Discord</a></li> <li><a href="https://discord.gg/yNzk4x7mpD" class="text-sm hover:text-primary-color">Discord</a></li>
<li><a href="https://www.facebook.com/stemmechanics" class="text-sm hover:text-primary-color">Facebook</a></li> <li><a href="https://www.facebook.com/stemmechanics" class="text-sm hover:text-primary-color">Facebook</a></li>
<li><a href="https://www.stemcraft.com.au/" class="text-sm hover:text-primary-color">STEMCraft (Minecraft)</a></li> <li><a href="https://www.stemcraft.com.au/" class="text-sm hover:text-primary-color">STEMCraft (Minecraft)</a></li>
<li><a href="https://jenkins.stemmechanics.com.au/" class="text-sm hover:text-primary-color">Jenkins</a></li>
<li><a href="https://youtube.com/@STEMMechanics" class="text-sm hover:text-primary-color">YouTube</a></li> <li><a href="https://youtube.com/@STEMMechanics" class="text-sm hover:text-primary-color">YouTube</a></li>
</ul> </ul>
<ul class="sm:w-1/3 flex flex-col gap-0.5 text-center sm:text-left"> <ul class="sm:w-1/3 flex flex-col gap-0.5 text-center sm:text-left">

View File

@@ -43,7 +43,7 @@
</div> </div>
<div x-show="pageMenuOpen" @click.away="pageMenuOpen=false" x-cloak class="fixed left-0 top-0 h-full w-full z-20" role="menu" aria-labelledby="page-menu-button" tabindex="-1"> <div x-show="pageMenuOpen" @click.away="pageMenuOpen=false" x-cloak class="fixed left-0 top-0 h-full w-full z-20" role="menu" aria-labelledby="page-menu-button" tabindex="-1">
<div x-show="pageMenuOpen" @click="pageMenuOpen=false" class="absolute inset-0 bg-black bg-opacity-40 backdrop-blur-sm" <div x-show="pageMenuOpen" @click="pageMenuOpen=false" class="absolute inset-0 bg-black/40 backdrop-blur-sm"
x-transition:enter="transition ease-out duration-300" x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0" x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100" x-transition:enter-end="opacity-100"
@@ -90,7 +90,7 @@
@click.away="userMenuOpen=false" @click.away="userMenuOpen=false"
x-cloak x-cloak
> >
<div x-show="userMenuOpen" @click="userMenuOpen=false" class="fixed left-0 w-screen z-20 h-screen bg-black bg-opacity-40 backdrop-blur-sm" <div x-show="userMenuOpen" @click="userMenuOpen=false" class="fixed left-0 w-screen z-20 h-screen bg-black/40 backdrop-blur-sm"
x-transition:enter="transition ease-out duration-300" x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0" x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100" x-transition:enter-end="opacity-100"
@@ -99,7 +99,7 @@
x-transition:leave-end="opacity-0"></div> x-transition:leave-end="opacity-0"></div>
<div <div
x-show="userMenuOpen" x-show="userMenuOpen"
class="absolute w-full right-0 sm:right-5 sm:top-12 z-50 sm:mt-2 sm:w-64 origin-top-right sm:rounded-md bg-white py-3 px-2 shadow-lg border-t sm:ring-1 ring-black ring-opacity-25 focus:outline-none"> class="absolute w-full right-0 sm:right-5 sm:top-12 z-50 sm:mt-2 sm:w-64 origin-top-right sm:rounded-md bg-white py-3 px-2 shadow-lg border-t border-gray-200 sm:ring-1 ring-black/25 focus:outline-none">
@if(auth()->guest()) @if(auth()->guest())
<a href="{{ route('register') }}" class="block px-4 py-2 text-sm text-gray-700 rounded transition hover:bg-sky-600 hover:text-white" role="menuitem" tabindex="-1"><i class="fa-solid fa-pen-to-square w-4 mr-2"></i>Register</a> <a href="{{ route('register') }}" class="block px-4 py-2 text-sm text-gray-700 rounded transition hover:bg-sky-600 hover:text-white" role="menuitem" tabindex="-1"><i class="fa-solid fa-pen-to-square w-4 mr-2"></i>Register</a>
<a href="{{ route('login') }}" class="block px-4 py-2 text-sm text-gray-700 rounded transition hover:bg-sky-600 hover:text-white" role="menuitem" tabindex="-1"><i class="fa-solid fa-right-to-bracket w-4 mr-2"></i>Log in</a> <a href="{{ route('login') }}" class="block px-4 py-2 text-sm text-gray-700 rounded transition hover:bg-sky-600 hover:text-white" role="menuitem" tabindex="-1"><i class="fa-solid fa-right-to-bracket w-4 mr-2"></i>Log in</a>
@@ -127,7 +127,7 @@
}) })
} }
})"> })">
<div class="absolute inset-0 backdrop-blur-sm bg-opacity-40 bg-black"></div> <div class="absolute inset-0 backdrop-blur-sm bg-black/40"></div>
<div class="relative w-full mx-8 max-w-2xl bg-gray-50 p-2 rounded-lg shadow-lg" x-on:click.stop> <div class="relative w-full mx-8 max-w-2xl bg-gray-50 p-2 rounded-lg shadow-lg" x-on:click.stop>
<form action="{{ route('search.index') }}" method="GET"> <form action="{{ route('search.index') }}" method="GET">
<x-ui.search type="text" name="q" label="Search..." /> <x-ui.search type="text" name="q" label="Search..." />

View File

@@ -10,12 +10,12 @@
} }
@endphp @endphp
<a href="{{ route('workshop.show', $workshop) }}" class="flex flex-col bg-white border rounded-lg overflow-hidden hover:shadow-lg hover:scale-[101%] transition-all relative {{ $attributes->get('class') }}"> <a href="{{ route('workshop.show', $workshop) }}" class="flex flex-col bg-white border border-gray-200 rounded-lg overflow-hidden hover:shadow-lg hover:scale-[101%] transition-all relative {{ $attributes->get('class') }}">
<div class="shadow border rounded px-3 py-2 absolute top-2 left-2 flex flex-col justify-center items-center bg-white"> <div class="shadow border border-gray-200 rounded px-3 py-2 absolute top-2 left-2 flex flex-col justify-center items-center bg-white">
<div class="text-gray-600 font-bold leading-none">{{ $workshop->starts_at->format('j') }}</div> <div class="text-gray-600 font-bold leading-none">{{ $workshop->starts_at->format('j') }}</div>
<div class="text-gray-600 text-xs uppercase">{{ $workshop->starts_at->format('M') }}</div> <div class="text-gray-600 text-xs uppercase">{{ $workshop->starts_at->format('M') }}</div>
</div> </div>
<div class="border border-white border-opacity-50 absolute flex items-center justify-center top-5 -right-9 bg-gray-500 w-36 text-sm text-white font-bold uppercase py-1 rotate-45 h-8 sm-banner-{{ strtolower($statusClass) }}">{{ $statusTitle }}</div> <div class="border border-white/50 absolute flex items-center justify-center top-5 -right-9 bg-gray-500 w-36 text-sm text-white font-bold uppercase py-1 rotate-45 h-8 sm-banner-{{ strtolower($statusClass) }}">{{ $statusTitle }}</div>
<img src="{{ $workshop->hero?->url }}?md" alt="{{ $workshop->title }}" class="w-full h-64 object-cover object-center"> <img src="{{ $workshop->hero?->url }}?md" alt="{{ $workshop->title }}" class="w-full h-64 object-cover object-center">
<div class="flex-grow p-4 flex flex-col"> <div class="flex-grow p-4 flex flex-col">
<h2 class="flex-grow {{ strlen($workshop->title) > 25 ? 'text-lg' : 'text-xl' }} font-bold mb-2">{{ $workshop->title }}</h2> <h2 class="flex-grow {{ strlen($workshop->title) > 25 ? 'text-lg' : 'text-xl' }} font-bold mb-2">{{ $workshop->title }}</h2>

View File

@@ -1,23 +1,23 @@
<x-layout> <x-layout>
<x-mast title="Search" description='Results for "{{ $search }}"' /> <x-mast title="Search" description='Results for "{{ $search }}"' />
<x-container> <x-container>
<section class="bg-gray-100"> {{-- <section class="bg-gray-100">--}}
<h2 class="text-2xl font-bold my-6">Posts</h2> {{-- <h2 class="text-2xl font-bold my-6">Posts</h2>--}}
@if($posts->isEmpty()) {{-- @if($posts->isEmpty())--}}
<x-container class="mt-8"> {{-- <x-container class="mt-8">--}}
<x-none-found item="posts" search="{{ request()->get('search') }}" /> {{-- <x-none-found item="posts" search="{{ request()->get('search') }}" />--}}
</x-container> {{-- </x-container>--}}
@else {{-- @else--}}
<x-container class="mt-4" inner-class="grid md:grid-cols-2 lg:grid-cols-3 gap-8 w-full"> {{-- <x-container class="mt-4" inner-class="grid md:grid-cols-2 lg:grid-cols-3 gap-8 w-full">--}}
@foreach ($posts as $post) {{-- @foreach ($posts as $post)--}}
<x-panel-post :post="$post" /> {{-- <x-panel-post :post="$post" />--}}
@endforeach {{-- @endforeach--}}
</x-container> {{-- </x-container>--}}
<x-container> {{-- <x-container>--}}
{{ $posts->appends(request()->except('post'))->links('', ['pageName' => 'post']) }} {{-- {{ $posts->appends(request()->except('post'))->links('', ['pageName' => 'post']) }}--}}
</x-container> {{-- </x-container>--}}
@endif {{-- @endif--}}
</section> {{-- </section>--}}
<section class="bg-gray-100"> <section class="bg-gray-100">
<h2 class="text-2xl font-bold my-6">Workshops</h2> <h2 class="text-2xl font-bold my-6">Workshops</h2>

View File

@@ -1,30 +0,0 @@
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./resources/**/*.blade.php",
"./resources/**/*.js",
'./vendor/**/*.blade.php',
],
theme: {
extend: {
boxShadow: {
'deep': '0 10px 15px rgba(0, 0, 0, 0.5)',
},
colors: {
'primary-color': '#0284C7', // sky-600
'primary-color-dark': '#0370A1', // sky-500
'primary-color-light': '#0EA5E9', // sky-400
'danger-color': '#b91c1c', // red-600
'danger-color-dark': '#991b1b', // red-500
'danger-color-light': '#dc2626', // red-400
'success-color': '#16a34a', // green-600
'success-color-dark': '#22c55e', // green-500
'success-color-light': '#4ade80', // green-400
},
},
},
plugins: [],
}

View File

@@ -1,5 +1,6 @@
import { defineConfig } from 'vite'; import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin'; import laravel from 'laravel-vite-plugin';
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({ export default defineConfig({
plugins: [ plugins: [
@@ -7,5 +8,6 @@ export default defineConfig({
input: ['resources/css/app.css', 'resources/js/app.js'], input: ['resources/css/app.css', 'resources/js/app.js'],
refresh: true, refresh: true,
}), }),
tailwindcss(),
], ],
}); });