✨ Split tasks by status
@@ -12,6 +12,7 @@ },
"devDependencies": { "@sveltejs/vite-plugin-svelte": "^5.0.3", "@tsconfig/svelte": "^5.0.4", + "@types/luxon": "^3", "svelte": "^5.15.0", "svelte-check": "^4.1.1", "typescript": "~5.6.2",@@ -24,6 +25,7 @@ "@inrupt/solid-client-authn-browser": "^2.3.0",
"@inrupt/vocab-common-rdf": "^1.0.5", "@tailwindcss/vite": "^4.0.1", "daisyui": "^5.0.0-beta.6", + "luxon": "^3.5.0", "tailwindcss": "^4.0.1" } }
@@ -6,7 +6,7 @@ const element = e.target as HTMLInputElement;
const inputValue = element?.value; const enterKeys = ["Enter", "NumpadEnter"]; if (inputValue && enterKeys.includes(e.code)) { - tasksStore.addTask({ name: inputValue }); + tasksStore.addTask({ name: inputValue, startTime: new Date() }); element.value = ""; } };
@@ -19,7 +19,8 @@
const onUpdateDone: FormEventHandler<HTMLInputElement> = e => { const element = e.target as HTMLInputElement; const done = element.checked; - tasksStore.updateTask(task.id, { done }); + const endTime = done ? new Date() : null; + tasksStore.updateTask(task.id, { done, endTime }); }; const onUpdateDueDate: FormEventHandler<HTMLInputElement> = e => {@@ -55,6 +56,7 @@ contenteditable
autocorrect="off" oninput={debounce(onUpdateName, 750)} class:line-through={task.done} + class:text-gray-400={task.done} onkeydown={onKeyDown} onkeyup={onKeyUp} >@@ -64,7 +66,10 @@ <input
type="date" value={task.dueDate?.toISOString().split("T")[0]} onchange={onUpdateDueDate} - class:text-red-400={task.dueDate && task.dueDate < new Date()} + disabled={task.done} + class:text-red-400={!task.done && + task.dueDate && + task.dueDate < new Date()} class:text-primary={task.dueDate && task.dueDate >= new Date()} class="rounded px-1 h-fit" />
@@ -1,11 +0,0 @@
-<script lang="ts"> - import TaskItem from "./TaskItem.svelte"; - - let { tasks = [] }: { tasks: Task[] } = $props(); -</script> - -<ul class="py-4 list"> - {#each tasks as task} - <TaskItem {task} /> - {/each} -</ul>
@@ -0,0 +1,27 @@
+<script lang="ts"> + import { DateTime } from "luxon"; + import TasksList from "./TasksList.svelte"; + + let { tasks = [] }: { tasks: Task[] } = $props(); + + const today = DateTime.now().endOf("day"); + + let { previousTasks, currentTasks, nextTasks } = $derived( + tasks.reduce<Record<string, Task[]>>( + (acc, task) => { + if (task.endTime) acc.previousTasks.push(task); + else if (task.dueDate) { + const dueDate = DateTime.fromJSDate(task.dueDate); + if (dueDate <= today) acc.currentTasks.push(task); + else acc.nextTasks.push(task); + } else acc.currentTasks.push(task); + return acc; + }, + { previousTasks: [], currentTasks: [], nextTasks: [] } + ) + ); +</script> + +<TasksList title="À faire" tasks={currentTasks} openOnLoad /> +<TasksList title="Plus tard" tasks={nextTasks} /> +<TasksList title="Fait" tasks={previousTasks} />
@@ -0,0 +1,33 @@
+<script lang="ts"> + import TaskItem from "./TaskItem.svelte"; + + let { + title, + tasks = [], + openOnLoad = false, + }: { tasks: Task[]; title: string; openOnLoad?: boolean } = $props(); + let open = $state(openOnLoad); + + let sortedTasks = $derived( + tasks.sort((taskA, taskB) => { + if (!taskA.dueDate) return -1; + else if (!taskB.dueDate) return 1; + else return taskA.dueDate.getTime() - taskB.dueDate.getTime(); + }) + ); +</script> + +<!-- svelte-ignore a11y_no_noninteractive_tabindex --> +<details class="collapse" bind:open> + <summary class="font-semibold collapse-title"> + {#if open} + ◦{:else} + •{/if} + {title}</summary + > + <ul class="py-4 list collapse-content"> + {#each sortedTasks as task} + <TaskItem {task} /> + {/each} + </ul> +</details>
@@ -31,6 +31,8 @@ done:
getUrl(taskThing, SCHEMA_CUSTOM.actionStatus) === SCHEMA_CUSTOM.ActionStatusType.done, dueDate: getDatetime(taskThing, SCHEMA_CUSTOM.scheduledTime), + startTime: getDatetime(taskThing, SCHEMA_INRUPT.startTime), + endTime: getDatetime(taskThing, SCHEMA_INRUPT.endTime), }); export const taskToThing = (task: Task) => {@@ -45,6 +47,8 @@ : SCHEMA_CUSTOM.ActionStatusType.active
); if (task.dueDate) taskThing.addDatetime(SCHEMA_CUSTOM.scheduledTime, task.dueDate); - + if (task.startTime) + taskThing.addDatetime(SCHEMA_INRUPT.startTime, task.startTime); + if (task.endTime) taskThing.addDatetime(SCHEMA_INRUPT.endTime, task.endTime); return taskThing.build(); };
@@ -5,7 +5,7 @@ handleIncomingRedirect,
fetch, } from "@inrupt/solid-client-authn-browser"; import { onMount } from "svelte"; - import Tasks from "../lib/components/Tasks.svelte"; + import TasksFeed from "../lib/components/TasksFeed.svelte"; import NewTask from "../lib/components/NewTask.svelte"; import tasksStore from "../lib/store/tasksStore"; import podInfo from "../lib/store/podInfoStore";@@ -55,7 +55,7 @@ <div class="flex justify-between">
<h1 class="text-2xl mb-4">kōi</h1> <Profile /> </div> - <Tasks tasks={$tasksStore} /> + <TasksFeed tasks={$tasksStore} /> <NewTask /> {:else} <div class="flex flex-col items-center mt-8 gap-4">
@@ -9,5 +9,7 @@ interface Task {
id: string; name: string; done?: boolean; + startTime: Date; dueDate?: Date | null; + endTime?: Date | null; }
@@ -275,6 +275,13 @@ checksum: 10c0/82ec381a27ab87b74154eaff79f626ee136a7aeb28836ea9bb7c480c8b81cf68bd61a092f5970844634a1b496e6ded1a7e0fc37cd2566c63d4fbe961929ae4b4
languageName: node linkType: hard +"@inrupt/vocab-common-rdf@npm:^1.0.5": + version: 1.0.5 + resolution: "@inrupt/vocab-common-rdf@npm:1.0.5" + checksum: 10c0/481c182d54df9213905a3e5c7e4d6318834c47eecef1e2d2cc48fbb5424c83186ea29647f33bf69d05e310aee222bd73fc643b7220cf8969494e90e645c74474 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2"@@ -572,6 +579,150 @@ checksum: 10c0/e3ad57e164e01c4c67f332901ed438aa83602e6d532ccafb7e35988082de6a2dd1de540b5cd6b879fcb1343e63666c5b0bab5ae691504d52c9e7f3fea691c40c
languageName: node linkType: hard +"@tailwindcss/node@npm:^4.0.3": + version: 4.0.3 + resolution: "@tailwindcss/node@npm:4.0.3" + dependencies: + enhanced-resolve: "npm:^5.18.0" + jiti: "npm:^2.4.2" + tailwindcss: "npm:4.0.3" + checksum: 10c0/feaa847d03d27fb6234fd1cb9aa1ce307c7282d42d7a20f060650fc30445d325cccd933c5f116ae79e0b878aa66edf97efcd19e8376826a6ac17a26e21570d0e + languageName: node + linkType: hard + +"@tailwindcss/oxide-android-arm64@npm:4.0.3": + version: 4.0.3 + resolution: "@tailwindcss/oxide-android-arm64@npm:4.0.3" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-darwin-arm64@npm:4.0.3": + version: 4.0.3 + resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.0.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-darwin-x64@npm:4.0.3": + version: 4.0.3 + resolution: "@tailwindcss/oxide-darwin-x64@npm:4.0.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-freebsd-x64@npm:4.0.3": + version: 4.0.3 + resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.0.3" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.0.3": + version: 4.0.3 + resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.0.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm64-gnu@npm:4.0.3": + version: 4.0.3 + resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.0.3" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm64-musl@npm:4.0.3": + version: 4.0.3 + resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.0.3" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-x64-gnu@npm:4.0.3": + version: 4.0.3 + resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.0.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-x64-musl@npm:4.0.3": + version: 4.0.3 + resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.0.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@tailwindcss/oxide-win32-arm64-msvc@npm:4.0.3": + version: 4.0.3 + resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.0.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-win32-x64-msvc@npm:4.0.3": + version: 4.0.3 + resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.0.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide@npm:^4.0.3": + version: 4.0.3 + resolution: "@tailwindcss/oxide@npm:4.0.3" + dependencies: + "@tailwindcss/oxide-android-arm64": "npm:4.0.3" + "@tailwindcss/oxide-darwin-arm64": "npm:4.0.3" + "@tailwindcss/oxide-darwin-x64": "npm:4.0.3" + "@tailwindcss/oxide-freebsd-x64": "npm:4.0.3" + "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.0.3" + "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.0.3" + "@tailwindcss/oxide-linux-arm64-musl": "npm:4.0.3" + "@tailwindcss/oxide-linux-x64-gnu": "npm:4.0.3" + "@tailwindcss/oxide-linux-x64-musl": "npm:4.0.3" + "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.0.3" + "@tailwindcss/oxide-win32-x64-msvc": "npm:4.0.3" + dependenciesMeta: + "@tailwindcss/oxide-android-arm64": + optional: true + "@tailwindcss/oxide-darwin-arm64": + optional: true + "@tailwindcss/oxide-darwin-x64": + optional: true + "@tailwindcss/oxide-freebsd-x64": + optional: true + "@tailwindcss/oxide-linux-arm-gnueabihf": + optional: true + "@tailwindcss/oxide-linux-arm64-gnu": + optional: true + "@tailwindcss/oxide-linux-arm64-musl": + optional: true + "@tailwindcss/oxide-linux-x64-gnu": + optional: true + "@tailwindcss/oxide-linux-x64-musl": + optional: true + "@tailwindcss/oxide-win32-arm64-msvc": + optional: true + "@tailwindcss/oxide-win32-x64-msvc": + optional: true + checksum: 10c0/6130012f51a6ae2624f50aa57dabc22117e6ff941cf0be425c60862df6c49f470a5d0b673f33b7e8b19a17fa92e0e1da147758af1793c021d991d8e133b92920 + languageName: node + linkType: hard + +"@tailwindcss/vite@npm:^4.0.1": + version: 4.0.3 + resolution: "@tailwindcss/vite@npm:4.0.3" + dependencies: + "@tailwindcss/node": "npm:^4.0.3" + "@tailwindcss/oxide": "npm:^4.0.3" + lightningcss: "npm:^1.29.1" + tailwindcss: "npm:4.0.3" + peerDependencies: + vite: ^5.2.0 || ^6 + checksum: 10c0/62636b1df294c5a0e2d7dd7625717aba080d21a10c46ba853eed936b10db0cbd8ce17dafde5443d4a4b1ee05e72888d9b472538e06ad28fda0ed233d26b0324d + languageName: node + linkType: hard + "@tsconfig/svelte@npm:^5.0.4": version: 5.0.4 resolution: "@tsconfig/svelte@npm:5.0.4"@@ -592,6 +743,13 @@ resolution: "@types/http-link-header@npm:1.0.7"
dependencies: "@types/node": "npm:*" checksum: 10c0/ffde4514a286ee62fab86bd5164958f5c9ad9d8012eaeb4f5536efa6157e6cf9f93121d5a39bf160c3712554d945300a223a9f8b1f3fb08cc70b73f539767338 + languageName: node + linkType: hard + +"@types/luxon@npm:^3": + version: 3.4.2 + resolution: "@types/luxon@npm:3.4.2" + checksum: 10c0/d835467de3daf7e17ba78b50bb5a14efd94272439ca067990d71332a54b311544459c69623eddd243b511b28d70194c9591a9ee8cf9c038962c965f991affd7e languageName: node linkType: hard@@ -841,6 +999,13 @@ checksum: 10c0/8fbdf9d56f47aea0794ab87b0eb9833baf80b01a7c5c1b0edc7faf25f662fb69ab18dc2199e2afcac54670ff0cd9607a9045a3f7a80336cccd18d77a55b9fdf0
languageName: node linkType: hard +"daisyui@npm:^5.0.0-beta.6": + version: 5.0.0-beta.6 + resolution: "daisyui@npm:5.0.0-beta.6" + checksum: 10c0/e8b8ee78b80ff2df61505fa7baa0835649a12c7e0df0fdea55dd06055e202bbebbb57ef26ee698d100b3a5e21d5aef3bdab09298cd5775a9d2ff8158400578e2 + languageName: node + linkType: hard + "debug@npm:4, debug@npm:^4.3.4, debug@npm:^4.3.7, debug@npm:^4.4.0": version: 4.4.0 resolution: "debug@npm:4.4.0"@@ -860,6 +1025,15 @@ checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044
languageName: node linkType: hard +"detect-libc@npm:^1.0.3": + version: 1.0.3 + resolution: "detect-libc@npm:1.0.3" + bin: + detect-libc: ./bin/detect-libc.js + checksum: 10c0/4da0deae9f69e13bc37a0902d78bf7169480004b1fed3c19722d56cff578d16f0e11633b7fbf5fb6249181236c72e90024cbd68f0b9558ae06e281f47326d50d + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0"@@ -887,6 +1061,16 @@ resolution: "encoding@npm:0.1.13"
dependencies: iconv-lite: "npm:^0.6.2" checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.18.0": + version: 5.18.1 + resolution: "enhanced-resolve@npm:5.18.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/4cffd9b125225184e2abed9fdf0ed3dbd2224c873b165d0838fd066cde32e0918626cba2f1f4bf6860762f13a7e2364fd89a82b99566be2873d813573ac71846 languageName: node linkType: hard@@ -1093,7 +1277,7 @@ checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e
languageName: node linkType: hard -"graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2@@ -1210,6 +1394,15 @@ checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9
languageName: node linkType: hard +"jiti@npm:^2.4.2": + version: 2.4.2 + resolution: "jiti@npm:2.4.2" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10c0/4ceac133a08c8faff7eac84aabb917e85e8257f5ad659e843004ce76e981c457c390a220881748ac67ba1b940b9b729b30fb85cbaf6e7989f04b6002c94da331 + languageName: node + linkType: hard + "jose@npm:^5.1.3": version: 5.9.6 resolution: "jose@npm:5.9.6"@@ -1269,15 +1462,131 @@ resolution: "koi@workspace:."
dependencies: "@inrupt/solid-client": "npm:^2.1.2" "@inrupt/solid-client-authn-browser": "npm:^2.3.0" + "@inrupt/vocab-common-rdf": "npm:^1.0.5" "@sveltejs/vite-plugin-svelte": "npm:^5.0.3" + "@tailwindcss/vite": "npm:^4.0.1" "@tsconfig/svelte": "npm:^5.0.4" + "@types/luxon": "npm:^3" + daisyui: "npm:^5.0.0-beta.6" + luxon: "npm:^3.5.0" svelte: "npm:^5.15.0" svelte-check: "npm:^4.1.1" + tailwindcss: "npm:^4.0.1" typescript: "npm:~5.6.2" vite: "npm:^6.0.5" languageName: unknown linkType: soft +"lightningcss-darwin-arm64@npm:1.29.1": + version: 1.29.1 + resolution: "lightningcss-darwin-arm64@npm:1.29.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-x64@npm:1.29.1": + version: 1.29.1 + resolution: "lightningcss-darwin-x64@npm:1.29.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-freebsd-x64@npm:1.29.1": + version: 1.29.1 + resolution: "lightningcss-freebsd-x64@npm:1.29.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-linux-arm-gnueabihf@npm:1.29.1": + version: 1.29.1 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.29.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"lightningcss-linux-arm64-gnu@npm:1.29.1": + version: 1.29.1 + resolution: "lightningcss-linux-arm64-gnu@npm:1.29.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-arm64-musl@npm:1.29.1": + version: 1.29.1 + resolution: "lightningcss-linux-arm64-musl@npm:1.29.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-linux-x64-gnu@npm:1.29.1": + version: 1.29.1 + resolution: "lightningcss-linux-x64-gnu@npm:1.29.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-x64-musl@npm:1.29.1": + version: 1.29.1 + resolution: "lightningcss-linux-x64-musl@npm:1.29.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-win32-arm64-msvc@npm:1.29.1": + version: 1.29.1 + resolution: "lightningcss-win32-arm64-msvc@npm:1.29.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-win32-x64-msvc@npm:1.29.1": + version: 1.29.1 + resolution: "lightningcss-win32-x64-msvc@npm:1.29.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"lightningcss@npm:^1.29.1": + version: 1.29.1 + resolution: "lightningcss@npm:1.29.1" + dependencies: + detect-libc: "npm:^1.0.3" + lightningcss-darwin-arm64: "npm:1.29.1" + lightningcss-darwin-x64: "npm:1.29.1" + lightningcss-freebsd-x64: "npm:1.29.1" + lightningcss-linux-arm-gnueabihf: "npm:1.29.1" + lightningcss-linux-arm64-gnu: "npm:1.29.1" + lightningcss-linux-arm64-musl: "npm:1.29.1" + lightningcss-linux-x64-gnu: "npm:1.29.1" + lightningcss-linux-x64-musl: "npm:1.29.1" + lightningcss-win32-arm64-msvc: "npm:1.29.1" + lightningcss-win32-x64-msvc: "npm:1.29.1" + dependenciesMeta: + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10c0/c2f421f8fdbdf7e5fe271f12d18ffaf332a11c88094b2bcfb90c56d6a442281c609e23ad56b8974002d61f117e171c967e1fe74ffa458bed810e6c7526cd8c93 + languageName: node + linkType: hard + "locate-character@npm:^3.0.0": version: 3.0.0 resolution: "locate-character@npm:3.0.0"@@ -1289,6 +1598,13 @@ "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0":
version: 10.4.3 resolution: "lru-cache@npm:10.4.3" checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + +"luxon@npm:^3.5.0": + version: 3.5.0 + resolution: "luxon@npm:3.5.0" + checksum: 10c0/335789bba95077db831ef99894edadeb23023b3eb2137a1b56acd0d290082b691cf793143d69e30bc069ec95f0b49f36419f48e951c68014f19ffe12045e3494 languageName: node linkType: hard@@ -1910,6 +2226,20 @@ locate-character: "npm:^3.0.0"
magic-string: "npm:^0.30.11" zimmerframe: "npm:^1.1.2" checksum: 10c0/f0ddd35633a9a246865db91a150e8957b6c5eb140044010aa68e8986b1efe712d5540a99aeeab33d68c63bb66a2f3dd3dccf304874dee3307e6b25785b153b9b + languageName: node + linkType: hard + +"tailwindcss@npm:4.0.3, tailwindcss@npm:^4.0.1": + version: 4.0.3 + resolution: "tailwindcss@npm:4.0.3" + checksum: 10c0/afab90685af6cecbdce61fec5e3a9ddd10696fd2e60e7ad7d5e2eceb5eaaa458a752f1ceb4176843377e8ded44ff5da52f42258a3e74b538920214986cfa9811 + languageName: node + linkType: hard + +"tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 languageName: node linkType: hard