mirror of
https://github.com/temetro/temetro.git
synced 2026-07-27 12:18:56 +00:00
ea2ecb572c
- lib/notes.ts: list/get/create/update/delete via the API client. - New /notes route + nav item (and shared lib/nav.ts entry, i18n key) so it shows in the sidebar and command palette. - components/notes/notes-view.tsx: a note list + "New note", with save/delete and toasts. - components/notes/notes-editor.tsx: a Word-like COSS Toolbar driving Tiptap (StarterKit + Placeholder) — bold/italic/underline, H1–H2, bullet/numbered lists, undo/redo — plus a title field and Save. Installed @coss/toolbar and @coss/toggle-group and the Tiptap packages. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
104 lines
3.5 KiB
TypeScript
104 lines
3.5 KiB
TypeScript
"use client";
|
|
|
|
import type { Toggle as TogglePrimitive } from "@base-ui/react/toggle";
|
|
import { ToggleGroup as ToggleGroupPrimitive } from "@base-ui/react/toggle-group";
|
|
import type { VariantProps } from "class-variance-authority";
|
|
import * as React from "react";
|
|
import { cn } from "@/lib/utils";
|
|
import { Separator } from "@/components/ui/separator";
|
|
import {
|
|
Toggle as ToggleComponent,
|
|
type toggleVariants,
|
|
} from "@/components/ui/toggle";
|
|
|
|
export const ToggleGroupContext: React.Context<
|
|
VariantProps<typeof toggleVariants>
|
|
> = React.createContext<VariantProps<typeof toggleVariants>>({
|
|
size: "default",
|
|
variant: "default",
|
|
});
|
|
|
|
export function ToggleGroup({
|
|
className,
|
|
variant = "default",
|
|
size = "default",
|
|
orientation = "horizontal",
|
|
children,
|
|
...props
|
|
}: ToggleGroupPrimitive.Props &
|
|
VariantProps<typeof toggleVariants>): React.ReactElement {
|
|
return (
|
|
<ToggleGroupPrimitive
|
|
className={cn(
|
|
"flex w-fit *:focus-visible:z-10 dark:*:[[data-slot=separator]:has(+[data-slot=toggle]:hover)]:before:bg-input/64 dark:*:[[data-slot=separator]:has(+[data-slot=toggle][data-pressed])]:before:bg-input dark:*:[[data-slot=toggle]:hover+[data-slot=separator]]:before:bg-input/64 dark:*:[[data-slot=toggle][data-pressed]+[data-slot=separator]]:before:bg-input",
|
|
orientation === "horizontal"
|
|
? "*:pointer-coarse:after:min-w-auto"
|
|
: "*:pointer-coarse:after:min-h-auto",
|
|
variant === "default"
|
|
? "gap-0.5"
|
|
: orientation === "horizontal"
|
|
? "*:not-first:rounded-s-none *:not-last:rounded-e-none *:not-first:border-s-0 *:not-last:border-e-0 *:not-first:not-data-[slot=separator]:before:-start-[0.5px] *:not-last:not-data-[slot=separator]:before:-end-[0.5px] *:not-first:before:rounded-s-none *:not-last:before:rounded-e-none"
|
|
: "flex-col *:not-first:rounded-t-none *:not-last:rounded-b-none *:not-first:border-t-0 *:not-last:border-b-0 *:not-first:not-data-[slot=separator]:before:-top-[0.5px] *:not-last:not-data-[slot=separator]:before:-bottom-[0.5px] *:not-first:before:rounded-t-none *:not-last:before:rounded-b-none *:data-[slot=toggle]:not-last:before:hidden dark:*:last:before:hidden dark:*:first:before:block",
|
|
className,
|
|
)}
|
|
data-size={size}
|
|
data-slot="toggle-group"
|
|
data-variant={variant}
|
|
orientation={orientation}
|
|
{...props}
|
|
>
|
|
<ToggleGroupContext.Provider value={{ size, variant }}>
|
|
{children}
|
|
</ToggleGroupContext.Provider>
|
|
</ToggleGroupPrimitive>
|
|
);
|
|
}
|
|
|
|
export function ToggleGroupItem({
|
|
className,
|
|
children,
|
|
variant,
|
|
size,
|
|
...props
|
|
}: TogglePrimitive.Props &
|
|
VariantProps<typeof toggleVariants>): React.ReactElement {
|
|
const context = React.useContext(ToggleGroupContext);
|
|
|
|
const resolvedVariant = context.variant || variant;
|
|
const resolvedSize = context.size || size;
|
|
|
|
return (
|
|
<ToggleComponent
|
|
className={className}
|
|
data-size={resolvedSize}
|
|
data-variant={resolvedVariant}
|
|
size={resolvedSize}
|
|
variant={resolvedVariant}
|
|
{...props}
|
|
>
|
|
{children}
|
|
</ToggleComponent>
|
|
);
|
|
}
|
|
|
|
export function ToggleGroupSeparator({
|
|
className,
|
|
orientation = "vertical",
|
|
...props
|
|
}: {
|
|
className?: string;
|
|
} & React.ComponentProps<typeof Separator>): React.ReactElement {
|
|
return (
|
|
<Separator
|
|
className={cn(
|
|
"pointer-events-none relative bg-input before:absolute before:inset-0 dark:before:bg-input/32",
|
|
className,
|
|
)}
|
|
orientation={orientation}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
|
|
export { ToggleGroupPrimitive };
|