mirror of
https://github.com/solidtime-io/solidtime.git
synced 2026-08-17 12:42:15 +01:00
improve dark mode color palette; rework font weights throughout the
interface
This commit is contained in:
@@ -57,11 +57,11 @@ const showEditModal = ref(false);
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="whitespace-nowrap flex items-center px-3 py-4 text-sm font-medium text-text-primary">
|
class="whitespace-nowrap flex items-center px-3 py-4 text-sm text-text-primary">
|
||||||
<span class="text-text-secondary"> {{ projectCount }} Projects </span>
|
<span> {{ projectCount }} Projects </span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="whitespace-nowrap px-3 py-4 text-sm text-text-secondary flex space-x-1.5 items-center font-medium">
|
class="whitespace-nowrap px-3 py-4 text-sm text-text-primary flex space-x-1.5 items-center">
|
||||||
<template v-if="client.is_archived">
|
<template v-if="client.is_archived">
|
||||||
<ArchiveBoxIcon class="w-4 text-icon-default"></ArchiveBoxIcon>
|
<ArchiveBoxIcon class="w-4 text-icon-default"></ArchiveBoxIcon>
|
||||||
<span>Archived</span>
|
<span>Archived</span>
|
||||||
|
|||||||
@@ -83,27 +83,28 @@ const userHasValidMailAddress = computed(() => {
|
|||||||
{{ member.name }}
|
{{ member.name }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="whitespace-nowrap px-3 py-4 text-sm text-text-secondary">
|
<div class="whitespace-nowrap px-3 py-4 text-sm text-text-primary">
|
||||||
{{ member.email }}
|
{{ member.email }}
|
||||||
</div>
|
</div>
|
||||||
<div class="whitespace-nowrap px-3 py-4 text-sm text-text-secondary">
|
<div class="whitespace-nowrap px-3 py-4 text-sm text-text-primary">
|
||||||
{{ capitalizeFirstLetter(member.role) }}
|
{{ capitalizeFirstLetter(member.role) }}
|
||||||
</div>
|
</div>
|
||||||
<div class="whitespace-nowrap px-3 py-4 text-sm text-text-secondary">
|
<div class="whitespace-nowrap px-3 py-4 text-sm text-text-primary">
|
||||||
{{
|
<span v-if="member.billable_rate">
|
||||||
member.billable_rate
|
{{
|
||||||
? formatCents(
|
formatCents(
|
||||||
member.billable_rate,
|
member.billable_rate,
|
||||||
organization?.currency,
|
organization?.currency,
|
||||||
organization?.currency_format,
|
organization?.currency_format,
|
||||||
organization?.currency_symbol,
|
organization?.currency_symbol,
|
||||||
organization?.number_format
|
organization?.number_format
|
||||||
)
|
)
|
||||||
: '--'
|
}}
|
||||||
}}
|
</span>
|
||||||
|
<span v-else class="text-text-tertiary"> -- </span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="whitespace-nowrap px-3 py-4 text-sm text-text-secondary flex space-x-1.5 items-center font-medium">
|
class="whitespace-nowrap px-3 py-4 text-sm text-text-primary flex space-x-1.5 items-center">
|
||||||
<template v-if="member.is_placeholder === false">
|
<template v-if="member.is_placeholder === false">
|
||||||
<CheckCircleIcon class="w-4 text-icon-default"></CheckCircleIcon>
|
<CheckCircleIcon class="w-4 text-icon-default"></CheckCircleIcon>
|
||||||
<span>Active</span>
|
<span>Active</span>
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ const billableRateInfo = computed(() => {
|
|||||||
return 'Default Rate';
|
return 'Default Rate';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return '--';
|
return null;
|
||||||
});
|
});
|
||||||
|
|
||||||
const showEditProjectModal = ref(false);
|
const showEditProjectModal = ref(false);
|
||||||
@@ -98,13 +98,13 @@ const showEditProjectModal = ref(false);
|
|||||||
</span>
|
</span>
|
||||||
<span class="text-text-secondary"> {{ projectTasksCount }} Tasks </span>
|
<span class="text-text-secondary"> {{ projectTasksCount }} Tasks </span>
|
||||||
</div>
|
</div>
|
||||||
<div class="whitespace-nowrap min-w-0 px-3 py-4 text-sm text-text-secondary">
|
<div class="whitespace-nowrap min-w-0 px-3 py-4 text-sm text-text-primary">
|
||||||
<div v-if="project.client_id" class="overflow-ellipsis overflow-hidden">
|
<div v-if="project.client_id" class="overflow-ellipsis overflow-hidden">
|
||||||
{{ client?.name }}
|
{{ client?.name }}
|
||||||
</div>
|
</div>
|
||||||
<div v-else>No client</div>
|
<div v-else class="text-text-tertiary">No client</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="whitespace-nowrap px-3 py-4 text-sm text-text-secondary">
|
<div class="whitespace-nowrap px-3 py-4 text-sm text-text-primary">
|
||||||
<div v-if="project.spent_time">
|
<div v-if="project.spent_time">
|
||||||
{{
|
{{
|
||||||
formatHumanReadableDuration(
|
formatHumanReadableDuration(
|
||||||
@@ -114,23 +114,24 @@ const showEditProjectModal = ref(false);
|
|||||||
)
|
)
|
||||||
}}
|
}}
|
||||||
</div>
|
</div>
|
||||||
<div v-else>--</div>
|
<div v-else class="text-text-tertiary">--</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="whitespace-nowrap px-3 flex items-center text-sm text-text-secondary">
|
<div class="whitespace-nowrap px-3 flex items-center text-sm text-text-primary">
|
||||||
<UpgradeBadge v-if="!isAllowedToPerformPremiumAction()"></UpgradeBadge>
|
<UpgradeBadge v-if="!isAllowedToPerformPremiumAction()"></UpgradeBadge>
|
||||||
<EstimatedTimeProgress
|
<EstimatedTimeProgress
|
||||||
v-else-if="project.estimated_time"
|
v-else-if="project.estimated_time"
|
||||||
:estimated="project.estimated_time"
|
:estimated="project.estimated_time"
|
||||||
:current="project.spent_time"></EstimatedTimeProgress>
|
:current="project.spent_time"></EstimatedTimeProgress>
|
||||||
<span v-else> -- </span>
|
<span v-else class="text-text-tertiary"> -- </span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="showBillableRate"
|
v-if="showBillableRate"
|
||||||
class="whitespace-nowrap px-3 py-4 text-sm text-text-secondary">
|
class="whitespace-nowrap px-3 py-4 text-sm text-text-primary">
|
||||||
{{ billableRateInfo }}
|
<span v-if="billableRateInfo">{{ billableRateInfo }}</span>
|
||||||
|
<span v-else class="text-text-tertiary">--</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="whitespace-nowrap px-3 py-4 text-sm text-text-secondary flex space-x-1.5 items-center font-medium">
|
class="whitespace-nowrap px-3 py-4 text-sm text-text-primary flex space-x-1.5 items-center font-medium">
|
||||||
<template v-if="project.is_archived">
|
<template v-if="project.is_archived">
|
||||||
<ArchiveBoxIcon class="w-4 text-icon-default"></ArchiveBoxIcon>
|
<ArchiveBoxIcon class="w-4 text-icon-default"></ArchiveBoxIcon>
|
||||||
<span>Archived</span>
|
<span>Archived</span>
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ defineProps<{
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="rounded-lg bg-card-background border-card-border shadow-card border px-3.5 py-2.5">
|
<div class="rounded-lg bg-card-background border-card-border shadow-card border px-3.5 py-2.5">
|
||||||
<dt class="font-semibold text-sm text-text-secondary">{{ title }}</dt>
|
<dt class="font-medium text-sm text-text-secondary">{{ title }}</dt>
|
||||||
<dd class="text-xl text-text-primary pt-1 font-semibold">
|
<dd class="text-xl text-text-primary pt-1 font-medium">
|
||||||
{{ value ?? '--' }}
|
{{ value ?? '--' }}
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ defineProps<{
|
|||||||
<div class="items-center justify-center flex-1 hidden @2xs:flex">
|
<div class="items-center justify-center flex-1 hidden @2xs:flex">
|
||||||
<DayOverviewCardChart :history="history"></DayOverviewCardChart>
|
<DayOverviewCardChart :history="history"></DayOverviewCardChart>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex text-sm items-center justify-center text-text-secondary min-w-[65px]">
|
<div class="flex text-sm items-center justify-center text-text-primary min-w-[65px]">
|
||||||
{{
|
{{
|
||||||
formatHumanReadableDuration(
|
formatHumanReadableDuration(
|
||||||
duration,
|
duration,
|
||||||
|
|||||||
@@ -47,9 +47,9 @@ async function startTaskTimer() {
|
|||||||
<template>
|
<template>
|
||||||
<div class="px-3.5 py-2 grid grid-cols-5">
|
<div class="px-3.5 py-2 grid grid-cols-5">
|
||||||
<div class="col-span-4">
|
<div class="col-span-4">
|
||||||
<p class="text-text-secondary text-sm pb-1.5 truncate">
|
<p class="text-text-primary text-sm pb-1.5 truncate">
|
||||||
<span v-if="timeEntry.description"> {{ timeEntry.description }}</span>
|
<span v-if="timeEntry.description"> {{ timeEntry.description }}</span>
|
||||||
<span v-else>No description</span>
|
<span v-else class="text-text-secondary">No description</span>
|
||||||
</p>
|
</p>
|
||||||
<ProjectBadge size="base" class="min-w-0 max-w-full" :color="project?.color">
|
<ProjectBadge size="base" class="min-w-0 max-w-full" :color="project?.color">
|
||||||
<div class="flex items-center lg:space-x-0.5 min-w-0">
|
<div class="flex items-center lg:space-x-0.5 min-w-0">
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ const { data: latestTeamActivity, isLoading } = useQuery({
|
|||||||
class="text-center flex flex-1 justify-center items-center">
|
class="text-center flex flex-1 justify-center items-center">
|
||||||
<div>
|
<div>
|
||||||
<UserGroupIcon class="w-8 text-icon-default inline pb-2"></UserGroupIcon>
|
<UserGroupIcon class="w-8 text-icon-default inline pb-2"></UserGroupIcon>
|
||||||
<h3 class="text-text-primary font-semibold text-sm">Invite your co-workers</h3>
|
<h3 class="text-text-primary font-medium text-sm">Invite your co-workers</h3>
|
||||||
<p class="pb-5 text-sm">You can invite your entire team.</p>
|
<p class="pb-5 text-sm">You can invite your entire team.</p>
|
||||||
<SecondaryButton @click="router.visit(route('members'))"
|
<SecondaryButton @click="router.visit(route('members'))"
|
||||||
>Go to Members
|
>Go to Members
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ defineProps<{
|
|||||||
<div class="col-span-2">
|
<div class="col-span-2">
|
||||||
<div class="flex justify-between">
|
<div class="flex justify-between">
|
||||||
<p
|
<p
|
||||||
class="text-xs min-w-0 overflow-ellipsis overflow-hidden flex-1 text-text-secondary">
|
class="text-sm font-medium min-w-0 overflow-ellipsis overflow-hidden flex-1 text-text-primary">
|
||||||
{{ name }}
|
{{ name }}
|
||||||
</p>
|
</p>
|
||||||
<div v-if="working" class="flex space-x-1.5 items-center justify-end">
|
<div v-if="working" class="flex space-x-1.5 items-center justify-end">
|
||||||
@@ -20,11 +20,11 @@ defineProps<{
|
|||||||
class="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-500 opacity-75"></span>
|
class="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-500 opacity-75"></span>
|
||||||
<span class="relative inline-flex rounded-full h-2 w-2 bg-green-500"></span>
|
<span class="relative inline-flex rounded-full h-2 w-2 bg-green-500"></span>
|
||||||
</span>
|
</span>
|
||||||
<span class="text-green-500 font-medium text-sm block pb-0.5"> working </span>
|
<span class="text-green-500 text-sm block pb-0.5"> working </span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="text-text-secondary text-sm font-medium text-ellipsis whitespace-nowrap max-w-full overflow-hidden">
|
class="text-text-secondary text-sm text-ellipsis whitespace-nowrap max-w-full overflow-hidden">
|
||||||
{{ description }}
|
{{ description }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ const open = useSessionStorage('nav-collapse-state-' + props.title, true);
|
|||||||
<CollapsibleRoot v-else v-model:open="open"
|
<CollapsibleRoot v-else v-model:open="open"
|
||||||
><CollapsibleTrigger class="w-full group py-0.5">
|
><CollapsibleTrigger class="w-full group py-0.5">
|
||||||
<div
|
<div
|
||||||
class="text-text-secondary group-hover:text-text-primary group-hover:bg-menu-active group flex gap-x-2 rounded-md transition leading-6 py-0.5 px-2 font-medium text-sm items-center justify-between">
|
class="text-text-secondary group-hover:text-text-primary group-hover:bg-menu-active group flex gap-x-2 rounded-md transition leading-6 py-0.5 px-2 font-regular text-sm items-center justify-between">
|
||||||
<div class="flex items-center gap-x-2">
|
<div class="flex items-center gap-x-2">
|
||||||
<component
|
<component
|
||||||
:is="icon"
|
:is="icon"
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ const sizeClasses = {
|
|||||||
:disabled="loading"
|
:disabled="loading"
|
||||||
:class="
|
:class="
|
||||||
twMerge(
|
twMerge(
|
||||||
'bg-button-secondary-background border border-button-secondary-border hover:bg-button-secondary-background-hover shadow-sm transition text-text-primary rounded-lg font-semibold inline-flex items-center space-x-1.5 focus-visible:outline-none focus-visible:border-transparent focus-visible:ring-2 focus-visible:ring-ring focus:border-transparent disabled:opacity-25 ease-in-out',
|
'bg-button-secondary-background border border-button-secondary-border hover:bg-button-secondary-background-hover shadow-sm transition text-text-primary rounded-lg font-medium inline-flex items-center space-x-1.5 focus-visible:outline-none focus-visible:border-transparent focus-visible:ring-2 focus-visible:ring-ring focus:border-transparent disabled:opacity-25 ease-in-out',
|
||||||
sizeClasses[props.size],
|
sizeClasses[props.size],
|
||||||
props.class
|
props.class
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ const emit = defineEmits<{
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="flex items-center justify-between bg-background px-2 py-1.5">
|
<div class="flex items-center justify-between bg-default-background px-2 py-1.5">
|
||||||
<!-- Left: Navigation -->
|
<!-- Left: Navigation -->
|
||||||
<div class="flex items-center gap-1">
|
<div class="flex items-center gap-1">
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@@ -494,7 +494,7 @@ function getEventDurationSeconds(dayEvent: DayEvent, dayStr: string): number {
|
|||||||
<div
|
<div
|
||||||
class="fc-header-scroll flex border-b border-border shrink-0 sticky top-0 z-10 bg-default-background">
|
class="fc-header-scroll flex border-b border-border shrink-0 sticky top-0 z-10 bg-default-background">
|
||||||
<div
|
<div
|
||||||
class="shrink-0 bg-background border-r border-border"
|
class="shrink-0 bg-default-background border-r border-border"
|
||||||
:style="{
|
:style="{
|
||||||
width: TIME_AXIS_WIDTH + 'px',
|
width: TIME_AXIS_WIDTH + 'px',
|
||||||
minWidth: TIME_AXIS_WIDTH + 'px',
|
minWidth: TIME_AXIS_WIDTH + 'px',
|
||||||
@@ -526,7 +526,7 @@ function getEventDurationSeconds(dayEvent: DayEvent, dayStr: string): number {
|
|||||||
<div ref="scrollerRef" class="fc-scroller">
|
<div ref="scrollerRef" class="fc-scroller">
|
||||||
<div class="flex min-w-0">
|
<div class="flex min-w-0">
|
||||||
<div
|
<div
|
||||||
class="shrink-0 bg-background border-r border-border"
|
class="shrink-0 bg-default-background border-r border-border"
|
||||||
:style="{
|
:style="{
|
||||||
width: TIME_AXIS_WIDTH + 'px',
|
width: TIME_AXIS_WIDTH + 'px',
|
||||||
minWidth: TIME_AXIS_WIDTH + 'px',
|
minWidth: TIME_AXIS_WIDTH + 'px',
|
||||||
@@ -553,7 +553,7 @@ function getEventDurationSeconds(dayEvent: DayEvent, dayStr: string): number {
|
|||||||
class="flex-1 min-w-0 relative"
|
class="flex-1 min-w-0 relative"
|
||||||
@pointerdown="guardedSlotPointerDown($event)">
|
@pointerdown="guardedSlotPointerDown($event)">
|
||||||
<div
|
<div
|
||||||
class="bg-background relative"
|
class="bg-default-background relative"
|
||||||
:style="{ height: totalGridHeight + 'px' }">
|
:style="{ height: totalGridHeight + 'px' }">
|
||||||
<div
|
<div
|
||||||
class="absolute inset-0 grid"
|
class="absolute inset-0 grid"
|
||||||
|
|||||||
@@ -32,10 +32,10 @@ const displaysPlaceholder = computed(() => {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="relative min-w-0 text-ellipsis whitespace-nowrap overflow-hidden">
|
<div class="relative min-w-0 text-ellipsis whitespace-nowrap overflow-hidden">
|
||||||
<div class="relative text-sm font-medium min-w-0">
|
<div class="relative text-sm min-w-0">
|
||||||
<div
|
<div
|
||||||
:class="[
|
:class="[
|
||||||
'opacity-0 h-4 text-sm whitespace-pre font-medium min-w-0 pl-1.5 @lg:pl-3 pr-1',
|
'opacity-0 h-4 text-sm whitespace-pre min-w-0 pl-1.5 @lg:pl-3 pr-1',
|
||||||
{ 'min-w-[130px]': displaysPlaceholder },
|
{ 'min-w-[130px]': displaysPlaceholder },
|
||||||
]">
|
]">
|
||||||
{{ liveDataValue }}
|
{{ liveDataValue }}
|
||||||
@@ -44,7 +44,7 @@ const displaysPlaceholder = computed(() => {
|
|||||||
data-testid="time_entry_description"
|
data-testid="time_entry_description"
|
||||||
:value="liveDataValue"
|
:value="liveDataValue"
|
||||||
placeholder="Add a description"
|
placeholder="Add a description"
|
||||||
class="absolute px-0 h-full min-w-0 pl-1.5 @lg:pl-3 pr-1 left-0 top-0 w-full text-sm text-text-primary font-medium bg-transparent focus-visible:ring-0 rounded-lg border-0"
|
class="absolute px-0 h-full min-w-0 pl-1.5 @lg:pl-3 pr-1 left-0 top-0 w-full text-sm text-text-primary bg-transparent focus-visible:ring-0 rounded-lg border-0"
|
||||||
@blur="onChange"
|
@blur="onChange"
|
||||||
@input="onInput"
|
@input="onInput"
|
||||||
@keydown.enter="onChange" />
|
@keydown.enter="onChange" />
|
||||||
|
|||||||
@@ -36,15 +36,13 @@ const organization = inject<ComputedRef<Organization>>('organization');
|
|||||||
:class="
|
:class="
|
||||||
twMerge(
|
twMerge(
|
||||||
'text-text-secondary px-1 bg-transparent text-center hover:bg-card-background rounded-lg border border-transparent hover:border-card-border focus-visible:outline-none focus:outline-none focus-visible:ring-2 focus-visible:text-text-primary focus-visible:ring-ring focus-visible:bg-tertiary',
|
'text-text-secondary px-1 bg-transparent text-center hover:bg-card-background rounded-lg border border-transparent hover:border-card-border focus-visible:outline-none focus:outline-none focus-visible:ring-2 focus-visible:text-text-primary focus-visible:ring-ring focus-visible:bg-tertiary',
|
||||||
showDate
|
showDate ? 'text-xs py-1.5 font-medium' : 'text-sm py-1.5 font-normal',
|
||||||
? 'text-xs py-1.5 font-semibold'
|
|
||||||
: 'text-sm py-1.5 font-medium',
|
|
||||||
organization?.time_format === '12-hours' ? 'w-[160px]' : 'w-[100px]',
|
organization?.time_format === '12-hours' ? 'w-[160px]' : 'w-[100px]',
|
||||||
open && 'border-card-border bg-card-background'
|
open && 'border-card-border bg-card-background'
|
||||||
)
|
)
|
||||||
">
|
">
|
||||||
{{ formatStartEnd(start, end, organization?.time_format) }}
|
{{ formatStartEnd(start, end, organization?.time_format) }}
|
||||||
<span v-if="showDate" class="text-text-tertiary font-medium"
|
<span v-if="showDate" class="text-text-tertiary font-normal"
|
||||||
>{{ formatDateLocalized(start, organization?.date_format) }}
|
>{{ formatDateLocalized(start, organization?.date_format) }}
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -148,8 +148,7 @@ async function handleDeleteTimeEntry() {
|
|||||||
:task="timeEntry.task_id"
|
:task="timeEntry.task_id"
|
||||||
@changed="updateProjectAndTask"></TimeTrackerProjectTaskDropdown>
|
@changed="updateProjectAndTask"></TimeTrackerProjectTaskDropdown>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div class="hidden @lg:flex items-center space-x-1 @lg:space-x-2 shrink-0">
|
||||||
class="hidden @lg:flex items-center font-medium space-x-1 @lg:space-x-2 shrink-0">
|
|
||||||
<div v-if="showMember && members" class="text-sm px-2">
|
<div v-if="showMember && members" class="text-sm px-2">
|
||||||
{{ memberName }}
|
{{ memberName }}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -47,14 +47,14 @@ function selectUnselectAll(value: boolean) {
|
|||||||
class="group-hover:block hidden"
|
class="group-hover:block hidden"
|
||||||
@update:checked="selectUnselectAll"></Checkbox>
|
@update:checked="selectUnselectAll"></Checkbox>
|
||||||
</div>
|
</div>
|
||||||
<span class="font-medium text-text-secondary">
|
<span class="text-text-primary">
|
||||||
{{ formatWeekday(date) }}
|
{{ formatWeekday(date) }}
|
||||||
</span>
|
</span>
|
||||||
<span class="text-text-tertiary ml-2">
|
<span class="text-text-secondary ml-2">
|
||||||
{{ formatDate(date, organization?.date_format) }}
|
{{ formatDate(date, organization?.date_format) }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-text-secondary pr-2 @lg:pr-[92px]">
|
<div class="text-text-primary pr-2 @lg:pr-[92px]">
|
||||||
<span class="font-medium">
|
<span class="font-medium">
|
||||||
{{
|
{{
|
||||||
formatHumanReadableDuration(
|
formatHumanReadableDuration(
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ useSelectEvents(
|
|||||||
v-model="tempDescription"
|
v-model="tempDescription"
|
||||||
placeholder="What are you working on?"
|
placeholder="What are you working on?"
|
||||||
data-testid="time_entry_description"
|
data-testid="time_entry_description"
|
||||||
class="w-full rounded-l-lg py-4 sm:py-2.5 px-3.5 border-b border-b-card-background-separator @2xl:px-4 text-base text-text-primary bg-transparent border-none placeholder-text-secondary font-medium focus:ring-0 transition"
|
class="w-full rounded-l-lg py-4 sm:py-2.5 px-3.5 border-b border-b-card-background-separator @2xl:px-4 text-base text-text-primary bg-transparent border-none placeholder-text-secondary focus:ring-0 transition"
|
||||||
type="text"
|
type="text"
|
||||||
@keydown.enter="startTimerIfNotActive"
|
@keydown.enter="startTimerIfNotActive"
|
||||||
@keydown.esc="showDropdown = false"
|
@keydown.esc="showDropdown = false"
|
||||||
|
|||||||
@@ -14,28 +14,30 @@
|
|||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
:root.dark {
|
:root.dark {
|
||||||
--color-bg-primary: oklch(0.14 0.0041 285.97);
|
/* Linear/Raycast: cool blue-tinted neutrals, content surface at Material floor */
|
||||||
--color-bg-secondary: oklch(0.18 0.005 285.97);
|
--color-bg-primary: oklch(0.17 0 0); /* content surface */
|
||||||
--color-bg-tertiary: oklch(0.22 0.0112 285.97);
|
--color-bg-secondary: oklch(0.20 0 0); /* cards, input fills */
|
||||||
--color-bg-quaternary: oklch(0.26 0.015 285.97);
|
--color-bg-tertiary: oklch(0.25 0 0); /* hover / active row */
|
||||||
--color-bg-background: oklch(0.1 0 0);
|
--color-bg-quaternary: oklch(0.29 0 0); /* pressed / selected */
|
||||||
--color-text-primary: #ffffff;
|
--color-bg-elevated: oklch(0.22 0 0); /* popovers, modals, dropdowns */
|
||||||
--color-text-secondary: #e3e4e6;
|
--color-bg-background: oklch(0.14 0 0); /* sidebar / chrome — recessed */
|
||||||
--color-text-tertiary: #969799;
|
--color-text-primary: oklch(0.97 0 0);
|
||||||
--color-text-quaternary: #595a5c;
|
--color-text-secondary: oklch(0.85 0 0);
|
||||||
|
--color-text-tertiary: oklch(0.70 0 0);
|
||||||
|
--color-text-quaternary: oklch(0.55 0 0);
|
||||||
|
|
||||||
--color-border-primary: #191b1f;
|
--color-border-primary: oklch(0.24 0 0); /* separators — above elevated */
|
||||||
--color-border-secondary: oklch(0.25 0.0098 268.31);
|
--color-border-secondary: oklch(0.28 0 0); /* card borders */
|
||||||
--color-border-tertiary: #2c2e33;
|
--color-border-tertiary: oklch(0.32 0 0); /* input borders */
|
||||||
--color-border-quaternary: #393b42;
|
--color-border-quaternary: oklch(0.36 0 0); /* emphasized borders */
|
||||||
--color-input-border-active: rgba(255, 255, 255, 0.15);
|
--color-input-border-active: rgba(255, 255, 255, 0.18);
|
||||||
|
|
||||||
--theme-color-chart: var(--color-accent-200);
|
--theme-color-chart: var(--color-accent-200);
|
||||||
|
|
||||||
--theme-color-menu-active: var(--color-bg-secondary);
|
--theme-color-menu-active: var(--color-bg-secondary);
|
||||||
--theme-color-card-background: var(--color-bg-secondary);
|
--theme-color-card-background: var(--color-bg-secondary);
|
||||||
--theme-shadow-card: 0 4px 7px 0px rgb(0 0 0 / 15%);
|
--theme-shadow-card: 0 4px 7px 0px rgb(0 0 0 / 15%);
|
||||||
--theme-shadow-dropdown: 0 4px 7px 0px rgb(0 0 0 / 40%);
|
--theme-shadow-dropdown: 0 8px 24px -4px rgb(0 0 0 / 55%), 0 2px 6px 0 rgb(0 0 0 / 35%);
|
||||||
|
|
||||||
--theme-color-card-background-active: var(--color-bg-tertiary);
|
--theme-color-card-background-active: var(--color-bg-tertiary);
|
||||||
|
|
||||||
@@ -187,7 +189,7 @@ body {
|
|||||||
--foreground: var(--color-text-primary);
|
--foreground: var(--color-text-primary);
|
||||||
--card: var(--theme-color-card-background);
|
--card: var(--theme-color-card-background);
|
||||||
--card-foreground: var(--color-text-primary);
|
--card-foreground: var(--color-text-primary);
|
||||||
--popover: var(--color-bg-secondary);
|
--popover: var(--color-bg-elevated, var(--color-bg-secondary));
|
||||||
--popover-foreground: var(--color-text-primary);
|
--popover-foreground: var(--color-text-primary);
|
||||||
--primary: var(--color-bg-primary);
|
--primary: var(--color-bg-primary);
|
||||||
--primary-foreground: var(--color-text-primary);
|
--primary-foreground: var(--color-text-primary);
|
||||||
|
|||||||
Reference in New Issue
Block a user